Skip to content

Commit de8b2ac

Browse files
authored
Merge pull request #30 from projectdiscovery/issue-29-timestamp-debug-logs
support for optional timestamp addition to debug logs
2 parents 0e7d9ea + 1c357ca commit de8b2ac

2 files changed

Lines changed: 65 additions & 105 deletions

File tree

examples/basic/basic.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,11 @@ func main() {
1818
gologger.Debug().Str("state", "running").Msg("planner running")
1919
gologger.Debug().TimeStamp().Str("state", "running").Msg("with timestamp event")
2020
gologger.Warning().Str("state", "errored").Str("status", "404").Msg("could not run")
21+
22+
// with timestamp
23+
gologger.DefaultLogger.SetTimestamp(true, levels.LevelDebug)
24+
gologger.Debug().Msg("with automatic timestamp")
25+
gologger.Info().Msg("without automatic timestamp")
26+
2127
gologger.Fatal().Msg("bye bye")
2228
}

gologger.go

Lines changed: 59 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ func init() {
3333

3434
// Logger is a logger for logging structured data in a beautfiul and fast manner.
3535
type Logger struct {
36-
writer writer.Writer
37-
maxLevel levels.Level
38-
formatter formatter.Formatter
36+
writer writer.Writer
37+
maxLevel levels.Level
38+
formatter formatter.Formatter
39+
timestampMinLevel levels.Level
40+
timestamp bool
3941
}
4042

4143
// Log logs a message to a logger instance
@@ -74,6 +76,12 @@ func (l *Logger) SetWriter(writer writer.Writer) {
7476
l.writer = writer
7577
}
7678

79+
// SetTimestamp enables/disables automatic timestamp
80+
func (l *Logger) SetTimestamp(timestamp bool, minLevel levels.Level) {
81+
l.timestamp = timestamp
82+
l.timestampMinLevel = minLevel
83+
}
84+
7785
// Event is a log event to be written with data
7886
type Event struct {
7987
logger *Logger
@@ -82,6 +90,26 @@ type Event struct {
8290
metadata map[string]string
8391
}
8492

93+
func newDefaultEventWithLevel(level levels.Level) *Event {
94+
return newEventWithLevelAndLogger(level, DefaultLogger)
95+
}
96+
97+
func newEventWithLevelAndLogger(level levels.Level, l *Logger) *Event {
98+
event := &Event{
99+
logger: l,
100+
level: level,
101+
metadata: make(map[string]string),
102+
}
103+
if l.timestamp && level >= l.timestampMinLevel {
104+
event.TimeStamp()
105+
}
106+
return event
107+
}
108+
109+
func (e *Event) setLevelMetadata(level levels.Level) {
110+
e.metadata["label"] = labels[level]
111+
}
112+
85113
// Label applies a custom label on the log event
86114
func (e *Event) Label(label string) *Event {
87115
e.metadata["label"] = label
@@ -124,178 +152,104 @@ func (e *Event) MsgFunc(messageSupplier func() string) {
124152

125153
// Info writes a info message on the screen with the default label
126154
func Info() *Event {
127-
level := levels.LevelInfo
128-
event := &Event{
129-
logger: DefaultLogger,
130-
level: level,
131-
metadata: make(map[string]string),
132-
}
133-
event.metadata["label"] = labels[level]
155+
event := newDefaultEventWithLevel(levels.LevelInfo)
156+
event.setLevelMetadata(levels.LevelInfo)
134157
return event
135158
}
136159

137160
// Warning writes a warning message on the screen with the default label
138161
func Warning() *Event {
139-
level := levels.LevelWarning
140-
event := &Event{
141-
logger: DefaultLogger,
142-
level: level,
143-
metadata: make(map[string]string),
144-
}
145-
event.metadata["label"] = labels[level]
162+
event := newDefaultEventWithLevel(levels.LevelWarning)
163+
event.setLevelMetadata(levels.LevelWarning)
146164
return event
147165
}
148166

149167
// Error writes a error message on the screen with the default label
150168
func Error() *Event {
151-
level := levels.LevelError
152-
event := &Event{
153-
logger: DefaultLogger,
154-
level: level,
155-
metadata: make(map[string]string),
156-
}
157-
event.metadata["label"] = labels[level]
169+
event := newDefaultEventWithLevel(levels.LevelError)
170+
event.setLevelMetadata(levels.LevelError)
158171
return event
159172
}
160173

161174
// Debug writes an error message on the screen with the default label
162175
func Debug() *Event {
163-
level := levels.LevelDebug
164-
event := &Event{
165-
logger: DefaultLogger,
166-
level: level,
167-
metadata: make(map[string]string),
168-
}
169-
event.metadata["label"] = labels[level]
176+
event := newDefaultEventWithLevel(levels.LevelDebug)
177+
event.setLevelMetadata(levels.LevelDebug)
170178
return event
171179
}
172180

173181
// Fatal exits the program if we encounter a fatal error
174182
func Fatal() *Event {
175-
level := levels.LevelFatal
176-
event := &Event{
177-
logger: DefaultLogger,
178-
level: level,
179-
metadata: make(map[string]string),
180-
}
181-
event.metadata["label"] = labels[level]
183+
event := newDefaultEventWithLevel(levels.LevelFatal)
184+
event.setLevelMetadata(levels.LevelFatal)
182185
return event
183186
}
184187

185188
// Silent prints a string on stdout without any extra labels.
186189
func Silent() *Event {
187-
level := levels.LevelSilent
188-
event := &Event{
189-
logger: DefaultLogger,
190-
level: level,
191-
metadata: make(map[string]string),
192-
}
190+
event := newDefaultEventWithLevel(levels.LevelSilent)
191+
event.setLevelMetadata(levels.LevelSilent)
193192
return event
194193
}
195194

196195
// Print prints a string on stderr without any extra labels.
197196
func Print() *Event {
198-
level := levels.LevelInfo
199-
event := &Event{
200-
logger: DefaultLogger,
201-
level: level,
202-
metadata: make(map[string]string),
203-
}
197+
event := newDefaultEventWithLevel(levels.LevelInfo)
204198
return event
205199
}
206200

207201
// Verbose prints a string only in verbose output mode.
208202
func Verbose() *Event {
209-
level := levels.LevelVerbose
210-
event := &Event{
211-
logger: DefaultLogger,
212-
level: level,
213-
metadata: make(map[string]string),
214-
}
215-
event.metadata["label"] = labels[level]
203+
event := newDefaultEventWithLevel(levels.LevelVerbose)
204+
event.setLevelMetadata(levels.LevelVerbose)
216205
return event
217206
}
218207

219208
// Info writes a info message on the screen with the default label
220209
func (l *Logger) Info() *Event {
221-
level := levels.LevelInfo
222-
event := &Event{
223-
logger: l,
224-
level: level,
225-
metadata: make(map[string]string),
226-
}
227-
event.metadata["label"] = labels[level]
210+
event := newEventWithLevelAndLogger(levels.LevelInfo, l)
211+
event.setLevelMetadata(levels.LevelInfo)
228212
return event
229213
}
230214

231215
// Warning writes a warning message on the screen with the default label
232216
func (l *Logger) Warning() *Event {
233-
level := levels.LevelWarning
234-
event := &Event{
235-
logger: l,
236-
level: level,
237-
metadata: make(map[string]string),
238-
}
239-
event.metadata["label"] = labels[level]
217+
event := newEventWithLevelAndLogger(levels.LevelWarning, l)
218+
event.setLevelMetadata(levels.LevelWarning)
240219
return event
241220
}
242221

243222
// Error writes a error message on the screen with the default label
244223
func (l *Logger) Error() *Event {
245-
level := levels.LevelError
246-
event := &Event{
247-
logger: l,
248-
level: level,
249-
metadata: make(map[string]string),
250-
}
251-
event.metadata["label"] = labels[level]
224+
event := newEventWithLevelAndLogger(levels.LevelError, l)
225+
event.setLevelMetadata(levels.LevelError)
252226
return event
253227
}
254228

255229
// Debug writes an error message on the screen with the default label
256230
func (l *Logger) Debug() *Event {
257-
level := levels.LevelDebug
258-
event := &Event{
259-
logger: l,
260-
level: level,
261-
metadata: make(map[string]string),
262-
}
263-
event.metadata["label"] = labels[level]
231+
event := newEventWithLevelAndLogger(levels.LevelDebug, l)
232+
event.setLevelMetadata(levels.LevelDebug)
264233
return event
265234
}
266235

267236
// Fatal exits the program if we encounter a fatal error
268237
func (l *Logger) Fatal() *Event {
269-
level := levels.LevelFatal
270-
event := &Event{
271-
logger: l,
272-
level: level,
273-
metadata: make(map[string]string),
274-
}
275-
event.metadata["label"] = labels[level]
238+
event := newEventWithLevelAndLogger(levels.LevelFatal, l)
239+
event.setLevelMetadata(levels.LevelFatal)
276240
return event
277241
}
278242

279243
// Print prints a string on screen without any extra labels.
280244
func (l *Logger) Print() *Event {
281-
level := levels.LevelSilent
282-
event := &Event{
283-
logger: l,
284-
level: level,
285-
metadata: make(map[string]string),
286-
}
245+
event := newEventWithLevelAndLogger(levels.LevelSilent, l)
287246
return event
288247
}
289248

290249
// Verbose prints a string only in verbose output mode.
291250
func (l *Logger) Verbose() *Event {
292-
level := levels.LevelVerbose
293-
event := &Event{
294-
logger: l,
295-
level: level,
296-
metadata: make(map[string]string),
297-
}
298-
event.metadata["label"] = labels[level]
251+
event := newEventWithLevelAndLogger(levels.LevelVerbose, l)
252+
event.setLevelMetadata(levels.LevelVerbose)
299253
return event
300254
}
301255

0 commit comments

Comments
 (0)