Commit e025a873800413e3698160cb81dae2edbc1daa6e
1 parent
98708cdaf7
Exists in
master
platform agnostic (path/filepath)
Showing
2 changed files
with
173 additions
and
171 deletions
Show diff stats
gologger.go
1 | package gologger | File was deleted | |
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | "os" | ||
6 | "runtime" | ||
7 | "sync" | ||
8 | "time" | ||
9 | ) | ||
10 | |||
11 | var muEv = &sync.Mutex{} | ||
12 | var muEr = &sync.Mutex{} | ||
13 | |||
14 | const MaxLogFileSize5MB int64 = 5 * 1024 * 1024 | ||
15 | const MaxLogFileSize1MB int64 = 1 * 1024 * 1024 | ||
16 | const MaxLogFileSize500KB int64 = 500 * 1024 | ||
17 | const MaxLogFileSize100KB int64 = 100 * 1024 | ||
18 | const MaxLogFileSize512B int64 = 512 | ||
19 | |||
20 | const ErrDirName = "error-logs" | ||
21 | const EvtDirName = "event-logs" | ||
22 | |||
23 | type Logger struct { | ||
24 | eventf *os.File | ||
25 | eventFileName string | ||
26 | errorf *os.File | ||
27 | errorFileName string | ||
28 | } | ||
29 | |||
30 | var logger Logger | ||
31 | |||
32 | func Init(eventFileName, errorFileName string) error { | ||
33 | timestamp := "_" + time.Now().Format(time.RFC3339) | ||
34 | var err error | ||
35 | |||
36 | // create files | ||
37 | logger.eventFileName = eventFileName | ||
38 | logger.errorFileName = errorFileName | ||
39 | |||
40 | logger.eventf, err = os.Create("./" + EvtDirName + "/" + eventFileName + timestamp + ".txt") | ||
41 | |||
42 | if err != nil { | ||
43 | fmt.Printf("logger: new: couldn't create event log file\n") | ||
44 | return err | ||
45 | } | ||
46 | |||
47 | logger.errorf, err = os.Create("./" + ErrDirName + "/" + errorFileName + timestamp + ".txt") | ||
48 | |||
49 | if err != nil { | ||
50 | fmt.Printf("logger: new: couldn't create error log file\n") | ||
51 | return err | ||
52 | } | ||
53 | |||
54 | // create directories to keep log files | ||
55 | err = os.Mkdir(EvtDirName, os.ModePerm) | ||
56 | if err != nil { | ||
57 | if !os.IsExist(err) { | ||
58 | fmt.Printf("logger: mkdir: couldn't create event log directory\n") | ||
59 | return err | ||
60 | } | ||
61 | } | ||
62 | |||
63 | err = os.Mkdir(ErrDirName, os.ModePerm) | ||
64 | if err != nil { | ||
65 | if !os.IsExist(err) { | ||
66 | fmt.Printf("logger: new: couldn't create error log directory\n") | ||
67 | return err | ||
68 | } | ||
69 | } | ||
70 | |||
71 | return nil | ||
72 | } | ||
73 | |||
74 | func LogEvent(event string) { | ||
75 | muEv.Lock() | ||
76 | defer muEv.Unlock() | ||
77 | logger.eventf.WriteString(time.Now().Format(time.RFC3339) + ": " + event + "\n") | ||
78 | logger.splitEventLog() | ||
79 | } | ||
80 | |||
81 | func LogError(comment string, err error) { | ||
82 | muEr.Lock() | ||
83 | defer muEr.Unlock() | ||
84 | logger.errorf.WriteString(time.Now().Format(time.RFC3339) + ": " + comment + ": " + err.Error() + "\n") | ||
85 | logger.splitErrorLog() | ||
86 | } | ||
87 | |||
88 | func LogDetailedEvent(event string) { | ||
89 | muEv.Lock() | ||
90 | defer muEv.Unlock() | ||
91 | _, file, line, ok := runtime.Caller(1) | ||
92 | var s string | ||
93 | if ok { | ||
94 | s = fmt.Sprintf("%s: %s %d: %s\n", time.Now().Format(time.RFC3339), file, line, event) | ||
95 | } else { | ||
96 | s = fmt.Sprintf(time.Now().Format(time.RFC3339) + ": [can't retreive stack details]:" + event + "\n") | ||
97 | } | ||
98 | logger.eventf.WriteString(s) | ||
99 | logger.splitEventLog() | ||
100 | } | ||
101 | |||
102 | func LogDetailedError(err error) { | ||
103 | muEr.Lock() | ||
104 | defer muEr.Unlock() | ||
105 | _, file, line, ok := runtime.Caller(1) | ||
106 | var s string | ||
107 | if ok { | ||
108 | s = fmt.Sprintf("%s %s %d: %s\n", time.Now().Format(time.RFC3339), file, line, err.Error()) | ||
109 | } else { | ||
110 | s = fmt.Sprintf(time.Now().Format(time.RFC3339) + ": [can't retreive stack details]:" + err.Error() + "\n") | ||
111 | } | ||
112 | logger.errorf.WriteString(s) | ||
113 | logger.splitErrorLog() | ||
114 | } | ||
115 | |||
116 | func Close() { | ||
117 | // close files | ||
118 | err := logger.eventf.Close() | ||
119 | if err != nil { | ||
120 | fmt.Printf("logger: on exit: couldn't close event log file\n") | ||
121 | } | ||
122 | |||
123 | err = logger.errorf.Close() | ||
124 | if err != nil { | ||
125 | fmt.Printf("logger: on exit: couldn't close error log file\n") | ||
126 | } | ||
127 | } | ||
128 | |||
129 | func (l *Logger) splitEventLog() { | ||
130 | timestamp := "_" + time.Now().Format(time.RFC3339) | ||
131 | |||
132 | evfstats, _ := l.eventf.Stat() | ||
133 | if evfstats.Size() >= MaxLogFileSize100KB { | ||
134 | // close old file | ||
135 | err := l.eventf.Close() | ||
136 | if err != nil { | ||
137 | fmt.Printf("logger: split: couldn't close event file\n") | ||
138 | return | ||
139 | } | ||
140 | // open new file | ||
141 | var errnew error | ||
142 | l.eventf, errnew = os.Create("./" + EvtDirName + "/" + | ||
143 | l.eventFileName + timestamp + ".txt") | ||
144 | |||
145 | if errnew != nil { | ||
146 | fmt.Printf("logger: split: couldn't create event log file\n") | ||
147 | } | ||
148 | } | ||
149 | } | ||
150 | |||
151 | func (l *Logger) splitErrorLog() { | ||
152 | timestamp := "_" + time.Now().Format(time.RFC3339) | ||
153 | |||
154 | erfstats, _ := l.errorf.Stat() | ||
155 | if erfstats.Size() >= MaxLogFileSize100KB { | ||
156 | // close old file | ||
157 | err := l.errorf.Close() | ||
158 | if err != nil { | ||
159 | fmt.Printf("logger: split: couldn't close error file\n") | ||
160 | return | ||
161 | } | ||
162 | // open new file | ||
163 | var errnew error | ||
164 | l.errorf, errnew = os.Create("./" + ErrDirName + "/" + | ||
165 | l.errorFileName + timestamp + ".txt") | ||
166 | |||
167 | if errnew != nil { | ||
168 | fmt.Printf("logger: split: couldn't create error log file\n") | ||
169 | } | ||
170 | } | ||
171 | } | ||
172 | 1 | package gologger |
main.go
File was created | 1 | package gologger | |
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | "os" | ||
6 | "path/filepath" | ||
7 | "runtime" | ||
8 | "sync" | ||
9 | "time" | ||
10 | ) | ||
11 | |||
12 | var muEv = &sync.Mutex{} | ||
13 | var muEr = &sync.Mutex{} | ||
14 | |||
15 | const MaxLogFileSize5MB int64 = 5 * 1024 * 1024 | ||
16 | const MaxLogFileSize1MB int64 = 1 * 1024 * 1024 | ||
17 | const MaxLogFileSize500KB int64 = 500 * 1024 | ||
18 | const MaxLogFileSize100KB int64 = 100 * 1024 | ||
19 | const MaxLogFileSize512B int64 = 512 | ||
20 | |||
21 | const ErrDirName = "error-logs" | ||
22 | const EvtDirName = "event-logs" | ||
23 | |||
24 | type Logger struct { | ||
25 | eventf *os.File | ||
26 | eventFileName string | ||
27 | errorf *os.File | ||
28 | errorFileName string | ||
29 | } | ||
30 | |||
31 | var logger Logger | ||
32 | |||
33 | func Init(eventFileName, errorFileName string) error { | ||
34 | timestamp := "_" + time.Now().Format(time.RFC3339) | ||
35 | |||
36 | // create directories to keep log files | ||
37 | err := os.Mkdir(EvtDirName, os.ModePerm) | ||
38 | if err != nil { | ||
39 | if !os.IsExist(err) { | ||
40 | fmt.Printf("logger: mkdir: couldn't create event log directory\n") | ||
41 | return err | ||
42 | } | ||
43 | } | ||
44 | |||
45 | err = os.Mkdir(ErrDirName, os.ModePerm) | ||
46 | if err != nil { | ||
47 | if !os.IsExist(err) { | ||
48 | fmt.Printf("logger: new: couldn't create error log directory\n") | ||
49 | return err | ||
50 | } | ||
51 | } | ||
52 | |||
53 | // create files | ||
54 | logger.eventFileName = eventFileName | ||
55 | logger.errorFileName = errorFileName | ||
56 | |||
57 | path := filepath.Join(EvtDirName, eventFileName+timestamp) | ||
58 | logger.eventf, err = os.Create(path) | ||
59 | |||
60 | if err != nil { | ||
61 | fmt.Printf("logger: new: couldn't create event log file\n") | ||
62 | return err | ||
63 | } | ||
64 | |||
65 | path = filepath.Join(ErrDirName, errorFileName+timestamp) | ||
66 | logger.errorf, err = os.Create(path) | ||
67 | |||
68 | if err != nil { | ||
69 | fmt.Printf("logger: new: couldn't create error log file\n") | ||
70 | return err | ||
71 | } | ||
72 | |||
73 | return nil | ||
74 | } | ||
75 | |||
76 | func LogEvent(event string) { | ||
77 | muEv.Lock() | ||
78 | defer muEv.Unlock() | ||
79 | logger.eventf.WriteString(time.Now().Format(time.RFC3339) + ": " + event + "\n") | ||
80 | logger.splitEventLog() | ||
81 | } | ||
82 | |||
83 | func LogError(comment string, err error) { | ||
84 | muEr.Lock() | ||
85 | defer muEr.Unlock() | ||
86 | logger.errorf.WriteString(time.Now().Format(time.RFC3339) + ": " + comment + ": " + err.Error() + "\n") | ||
87 | logger.splitErrorLog() | ||
88 | } | ||
89 | |||
90 | func LogDetailedEvent(event string) { | ||
91 | muEv.Lock() | ||
92 | defer muEv.Unlock() | ||
93 | _, file, line, ok := runtime.Caller(1) | ||
94 | var s string | ||
95 | if ok { | ||
96 | s = fmt.Sprintf("%s: %s %d: %s\n", time.Now().Format(time.RFC3339), file, line, event) | ||
97 | } else { | ||
98 | s = fmt.Sprintf(time.Now().Format(time.RFC3339) + ": [can't retreive stack details]:" + event + "\n") | ||
99 | } | ||
100 | logger.eventf.WriteString(s) | ||
101 | logger.splitEventLog() | ||
102 | } | ||
103 | |||
104 | func LogDetailedError(err error) { | ||
105 | muEr.Lock() | ||
106 | defer muEr.Unlock() | ||
107 | _, file, line, ok := runtime.Caller(1) | ||
108 | var s string | ||
109 | if ok { | ||
110 | s = fmt.Sprintf("%s %s %d: %s\n", time.Now().Format(time.RFC3339), file, line, err.Error()) | ||
111 | } else { | ||
112 | s = fmt.Sprintf(time.Now().Format(time.RFC3339) + ": [can't retreive stack details]:" + err.Error() + "\n") | ||
113 | } | ||
114 | logger.errorf.WriteString(s) | ||
115 | logger.splitErrorLog() | ||
116 | } | ||
117 | |||
118 | func Close() { | ||
119 | // close files | ||
120 | err := logger.eventf.Close() | ||
121 | if err != nil { | ||
122 | fmt.Printf("logger: on exit: couldn't close event log file\n") | ||
123 | } | ||
124 | |||
125 | err = logger.errorf.Close() | ||
126 | if err != nil { | ||
127 | fmt.Printf("logger: on exit: couldn't close error log file\n") | ||
128 | } | ||
129 | } | ||
130 | |||
131 | func (l *Logger) splitEventLog() { | ||
132 | timestamp := "_" + time.Now().Format(time.RFC3339) | ||
133 | |||
134 | evfstats, _ := l.eventf.Stat() | ||
135 | if evfstats.Size() >= MaxLogFileSize100KB { | ||
136 | // close old file | ||
137 | err := l.eventf.Close() | ||
138 | if err != nil { | ||
139 | fmt.Printf("logger: split: couldn't close event file\n") | ||
140 | return | ||
141 | } | ||
142 | // open new file | ||
143 | var errnew error | ||
144 | path := filepath.Join(EvtDirName, l.eventFileName+timestamp) | ||
145 | l.eventf, errnew = os.Create(path) | ||
146 | |||
147 | if errnew != nil { | ||
148 | fmt.Printf("logger: split: couldn't create event log file\n") | ||
149 | } | ||
150 | } | ||
151 | } | ||
152 | |||
153 | func (l *Logger) splitErrorLog() { | ||
154 | timestamp := "_" + time.Now().Format(time.RFC3339) | ||
155 | |||
156 | erfstats, _ := l.errorf.Stat() | ||
157 | if erfstats.Size() >= MaxLogFileSize100KB { | ||
158 | // close old file | ||
159 | err := l.errorf.Close() | ||
160 | if err != nil { | ||
161 | fmt.Printf("logger: split: couldn't close error file\n") | ||
162 | return | ||
163 | } | ||
164 | // open new file | ||
165 | var errnew error | ||
166 | path := filepath.Join(ErrDirName, l.errorFileName+timestamp) | ||
167 | l.errorf, errnew = os.Create(path) | ||
168 | |||
169 | if errnew != nil { | ||
170 | fmt.Printf("logger: split: couldn't create error log file\n") | ||
171 | } | ||
172 | } | ||
173 | } | ||
174 |