Blame view

main.go 4.38 KB
a99c98307   Marko Tikvić   first commit
1
2
3
4
5
  package gologger
  
  import (
  	"fmt"
  	"os"
e025a8738   Marko Tikvić   platform agnostic...
6
  	"path/filepath"
98708cdaf   Marko Tikvić   new version, does...
7
  	"runtime"
3ba7b5695   Marko Tikvić   added mutex locks...
8
  	"sync"
baa4468b7   Marko Tikvić   Comments go befor...
9
  	"time"
a99c98307   Marko Tikvić   first commit
10
  )
baa4468b7   Marko Tikvić   Comments go befor...
11
12
13
14
15
  const MaxLogFileSize5MB int64 = 5 * 1024 * 1024
  const MaxLogFileSize1MB int64 = 1 * 1024 * 1024
  const MaxLogFileSize500KB int64 = 500 * 1024
  const MaxLogFileSize100KB int64 = 100 * 1024
  const MaxLogFileSize512B int64 = 512
a99c98307   Marko Tikvić   first commit
16
17
18
19
20
  
  const ErrDirName = "error-logs"
  const EvtDirName = "event-logs"
  
  type Logger struct {
23ce66f0f   Marko Tikvić   optional init par...
21
22
  	muEv   *sync.Mutex
  	eventf *os.File
a99c98307   Marko Tikvić   first commit
23
  	eventFileName string
23ce66f0f   Marko Tikvić   optional init par...
24
25
26
  
  	muEr   *sync.Mutex
  	errorf *os.File
a99c98307   Marko Tikvić   first commit
27
28
  	errorFileName string
  }
98708cdaf   Marko Tikvić   new version, does...
29
  var logger Logger
a99c98307   Marko Tikvić   first commit
30

98708cdaf   Marko Tikvić   new version, does...
31
  func Init(eventFileName, errorFileName string) error {
ce403bd83   Marko Tikvić   changed timestamp...
32
  	timestamp := "_" + time.Now().Format(time.RFC3339)
23ce66f0f   Marko Tikvić   optional init par...
33
34
35
36
37
38
39
40
41
42
43
  	var err error
  
  	// event file/dir
  	if eventFileName != "" {
  		err = os.Mkdir(EvtDirName, os.ModePerm)
  		if err != nil {
  			if !os.IsExist(err) {
  				fmt.Printf("logger: mkdir: couldn't create event log directory
  ")
  				return err
  			}
a99c98307   Marko Tikvić   first commit
44
  		}
a99c98307   Marko Tikvić   first commit
45

23ce66f0f   Marko Tikvić   optional init par...
46
47
48
49
50
51
  		logger.eventFileName = eventFileName
  		path := filepath.Join(EvtDirName, eventFileName+timestamp+".txt")
  		logger.eventf, err = os.Create(path)
  		if err != nil {
  			fmt.Printf("logger: new: couldn't create event log file
  ")
98708cdaf   Marko Tikvić   new version, does...
52
  			return err
a99c98307   Marko Tikvić   first commit
53
54
  		}
  	}
23ce66f0f   Marko Tikvić   optional init par...
55
56
57
58
59
60
61
62
63
64
  	// error file/dir
  	if errorFileName != "" {
  		err = os.Mkdir(ErrDirName, os.ModePerm)
  		if err != nil {
  			if !os.IsExist(err) {
  				fmt.Printf("logger: new: couldn't create error log directory
  ")
  				return err
  			}
  		}
e025a8738   Marko Tikvić   platform agnostic...
65

23ce66f0f   Marko Tikvić   optional init par...
66
67
68
69
70
71
72
73
  		logger.errorFileName = errorFileName
  		path := filepath.Join(ErrDirName, errorFileName+timestamp+".txt")
  		logger.errorf, err = os.Create(path)
  		if err != nil {
  			fmt.Printf("logger: new: couldn't create error log file
  ")
  			return err
  		}
e025a8738   Marko Tikvić   platform agnostic...
74
  	}
98708cdaf   Marko Tikvić   new version, does...
75
76
  	return nil
  }
327c98634   Marko Tikvić   added Print() for...
77
78
79
80
  func Print(s string) {
  	fmt.Printf(time.Now().Format(time.RFC3339) + ": " + s + "
  ")
  }
98708cdaf   Marko Tikvić   new version, does...
81
  func LogEvent(event string) {
23ce66f0f   Marko Tikvić   optional init par...
82
83
84
85
86
87
88
  	if logger.eventf != nil {
  		logger.muEv.Lock()
  		defer logger.muEv.Unlock()
  		logger.eventf.WriteString(time.Now().Format(time.RFC3339) + ": " + event + "
  ")
  		logger.splitEventLog()
  	}
98708cdaf   Marko Tikvić   new version, does...
89
90
91
  }
  
  func LogError(comment string, err error) {
23ce66f0f   Marko Tikvić   optional init par...
92
93
94
95
96
97
98
  	if logger.errorf != nil {
  		logger.muEr.Lock()
  		defer logger.muEr.Unlock()
  		logger.errorf.WriteString(time.Now().Format(time.RFC3339) + ": " + comment + ": " + err.Error() + "
  ")
  		logger.splitErrorLog()
  	}
98708cdaf   Marko Tikvić   new version, does...
99
  }
2f4b177f0   Marko Tikvić   trace log and tra...
100
  func TraceEvent(event string) {
23ce66f0f   Marko Tikvić   optional init par...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  	if logger.eventf != nil {
  		logger.muEv.Lock()
  		defer logger.muEv.Unlock()
  		_, file, line, ok := runtime.Caller(1)
  		var s string
  		if ok {
  			s = fmt.Sprintf("%s: %s %d: %s
  ", time.Now().Format(time.RFC3339), file, line, event)
  		} else {
  			s = fmt.Sprintf(time.Now().Format(time.RFC3339) + ": [can't retreive stack details]:" + event + "
  ")
  		}
  		logger.eventf.WriteString(s)
  		logger.splitEventLog()
98708cdaf   Marko Tikvić   new version, does...
115
  	}
98708cdaf   Marko Tikvić   new version, does...
116
  }
2f4b177f0   Marko Tikvić   trace log and tra...
117
  func TraceError(err error) {
23ce66f0f   Marko Tikvić   optional init par...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  	if logger.errorf != nil {
  		logger.muEr.Lock()
  		defer logger.muEr.Unlock()
  		_, file, line, ok := runtime.Caller(1)
  		var s string
  		if ok {
  			s = fmt.Sprintf("%s %s %d: %s
  ", time.Now().Format(time.RFC3339), file, line, err.Error())
  		} else {
  			s = fmt.Sprintf(time.Now().Format(time.RFC3339) + ": [can't retreive stack details]:" + err.Error() + "
  ")
  		}
  		logger.errorf.WriteString(s)
  		logger.splitErrorLog()
98708cdaf   Marko Tikvić   new version, does...
132
  	}
a99c98307   Marko Tikvić   first commit
133
  }
98708cdaf   Marko Tikvić   new version, does...
134
  func Close() {
23ce66f0f   Marko Tikvić   optional init par...
135
136
137
138
139
140
  	if logger.eventf != nil {
  		err := logger.eventf.Close()
  		if err != nil {
  			fmt.Printf("logger: on exit: couldn't close event log file
  ")
  		}
a99c98307   Marko Tikvić   first commit
141
  	}
23ce66f0f   Marko Tikvić   optional init par...
142
143
144
145
146
147
  	if logger.errorf != nil {
  		err := logger.errorf.Close()
  		if err != nil {
  			fmt.Printf("logger: on exit: couldn't close error log file
  ")
  		}
a99c98307   Marko Tikvić   first commit
148
149
150
151
  	}
  }
  
  func (l *Logger) splitEventLog() {
ce403bd83   Marko Tikvić   changed timestamp...
152
  	timestamp := "_" + time.Now().Format(time.RFC3339)
a99c98307   Marko Tikvić   first commit
153

a99c98307   Marko Tikvić   first commit
154
155
156
157
158
159
160
161
162
163
164
  	evfstats, _ := l.eventf.Stat()
  	if evfstats.Size() >= MaxLogFileSize100KB {
  		// close old file
  		err := l.eventf.Close()
  		if err != nil {
  			fmt.Printf("logger: split: couldn't close event file
  ")
  			return
  		}
  		// open new file
  		var errnew error
e025a8738   Marko Tikvić   platform agnostic...
165
166
  		path := filepath.Join(EvtDirName, l.eventFileName+timestamp)
  		l.eventf, errnew = os.Create(path)
a99c98307   Marko Tikvić   first commit
167
168
169
170
171
172
173
174
175
  
  		if errnew != nil {
  			fmt.Printf("logger: split: couldn't create event log file
  ")
  		}
  	}
  }
  
  func (l *Logger) splitErrorLog() {
ce403bd83   Marko Tikvić   changed timestamp...
176
  	timestamp := "_" + time.Now().Format(time.RFC3339)
a99c98307   Marko Tikvić   first commit
177
178
179
180
181
182
183
184
185
186
187
188
  
  	erfstats, _ := l.errorf.Stat()
  	if erfstats.Size() >= MaxLogFileSize100KB {
  		// close old file
  		err := l.errorf.Close()
  		if err != nil {
  			fmt.Printf("logger: split: couldn't close error file
  ")
  			return
  		}
  		// open new file
  		var errnew error
e025a8738   Marko Tikvić   platform agnostic...
189
190
  		path := filepath.Join(ErrDirName, l.errorFileName+timestamp)
  		l.errorf, errnew = os.Create(path)
a99c98307   Marko Tikvić   first commit
191
192
193
194
195
196
197
  
  		if errnew != nil {
  			fmt.Printf("logger: split: couldn't create error log file
  ")
  		}
  	}
  }