1
1
package logger
2
2
3
3
import (
4
+ "fmt"
4
5
"io"
5
6
"os"
7
+ "path/filepath"
8
+ "sort"
6
9
"time"
7
10
8
11
"github.com/charmbracelet/log"
@@ -11,6 +14,9 @@ import (
11
14
var Logger * log.Logger
12
15
var logFile * os.File
13
16
17
+ const maxLogSize = 10 * 1024 * 1024 // 10 MB
18
+ const maxLogFiles = 2
19
+
14
20
func InitLogger (logPath , logFileName , logLevel string ) error {
15
21
var err error
16
22
if logFileName == "" {
@@ -57,3 +63,65 @@ func CloseLogger() {
57
63
logFile .Close ()
58
64
}
59
65
}
66
+
67
+ func CheckLogSize (logPath , logFileName string ) error {
68
+ fileInfo , err := logFile .Stat ()
69
+ if err != nil {
70
+ return err
71
+ }
72
+ if fileInfo .Size () >= maxLogSize {
73
+ // Rotate the log file
74
+ backupName := fmt .Sprintf ("%s.%s" , logFileName , time .Now ().Format ("20060102T150405" ))
75
+ if err := os .Rename (filepath .Join (logPath , logFileName ), filepath .Join (logPath , backupName )); err != nil {
76
+ return err
77
+ }
78
+ // Open a new log file
79
+ logFile , err = os .OpenFile (filepath .Join (logPath , logFileName ), os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0666 )
80
+ if err != nil {
81
+ return err
82
+ }
83
+ // Update the logger's output
84
+ writer := io .Writer (logFile )
85
+ Logger .SetOutput (writer )
86
+
87
+ // Remove old log files if there are more than maxLogFiles
88
+ if err := RemoveOldLogFiles (logPath , logFileName ); err != nil {
89
+ return err
90
+ }
91
+ }
92
+ return nil
93
+ }
94
+
95
+ func RemoveOldLogFiles (logPath , logFileName string ) error {
96
+ files , err := os .ReadDir (logPath )
97
+ if err != nil {
98
+ return err
99
+ }
100
+
101
+ var logFiles []os.FileInfo
102
+ for _ , file := range files {
103
+ if file .Name () == logFileName || filepath .Ext (file .Name ()) == ".log" {
104
+ fileInfo , err := file .Info ()
105
+ if err != nil {
106
+ return err
107
+ }
108
+ logFiles = append (logFiles , fileInfo )
109
+ }
110
+ }
111
+
112
+ if len (logFiles ) <= maxLogFiles {
113
+ return nil
114
+ }
115
+
116
+ sort .Slice (logFiles , func (i , j int ) bool {
117
+ return logFiles [i ].ModTime ().After (logFiles [j ].ModTime ())
118
+ })
119
+
120
+ for _ , file := range logFiles [maxLogFiles :] {
121
+ if err := os .Remove (filepath .Join (logPath , file .Name ())); err != nil {
122
+ return err
123
+ }
124
+ }
125
+
126
+ return nil
127
+ }
0 commit comments