Skip to content

Commit

Permalink
Merge pull request #30 from projectdiscovery/issue-29-timestamp-debug…
Browse files Browse the repository at this point in the history
…-logs

support for optional timestamp addition to debug logs
  • Loading branch information
Mzack9999 authored Jan 5, 2023
2 parents 0e7d9ea + 1c357ca commit de8b2ac
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 105 deletions.
6 changes: 6 additions & 0 deletions examples/basic/basic.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,11 @@ func main() {
gologger.Debug().Str("state", "running").Msg("planner running")
gologger.Debug().TimeStamp().Str("state", "running").Msg("with timestamp event")
gologger.Warning().Str("state", "errored").Str("status", "404").Msg("could not run")

// with timestamp
gologger.DefaultLogger.SetTimestamp(true, levels.LevelDebug)
gologger.Debug().Msg("with automatic timestamp")
gologger.Info().Msg("without automatic timestamp")

gologger.Fatal().Msg("bye bye")
}
164 changes: 59 additions & 105 deletions gologger.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,11 @@ func init() {

// Logger is a logger for logging structured data in a beautfiul and fast manner.
type Logger struct {
writer writer.Writer
maxLevel levels.Level
formatter formatter.Formatter
writer writer.Writer
maxLevel levels.Level
formatter formatter.Formatter
timestampMinLevel levels.Level
timestamp bool
}

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

// SetTimestamp enables/disables automatic timestamp
func (l *Logger) SetTimestamp(timestamp bool, minLevel levels.Level) {
l.timestamp = timestamp
l.timestampMinLevel = minLevel
}

// Event is a log event to be written with data
type Event struct {
logger *Logger
Expand All @@ -82,6 +90,26 @@ type Event struct {
metadata map[string]string
}

func newDefaultEventWithLevel(level levels.Level) *Event {
return newEventWithLevelAndLogger(level, DefaultLogger)
}

func newEventWithLevelAndLogger(level levels.Level, l *Logger) *Event {
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
if l.timestamp && level >= l.timestampMinLevel {
event.TimeStamp()
}
return event
}

func (e *Event) setLevelMetadata(level levels.Level) {
e.metadata["label"] = labels[level]
}

// Label applies a custom label on the log event
func (e *Event) Label(label string) *Event {
e.metadata["label"] = label
Expand Down Expand Up @@ -124,178 +152,104 @@ func (e *Event) MsgFunc(messageSupplier func() string) {

// Info writes a info message on the screen with the default label
func Info() *Event {
level := levels.LevelInfo
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newDefaultEventWithLevel(levels.LevelInfo)
event.setLevelMetadata(levels.LevelInfo)
return event
}

// Warning writes a warning message on the screen with the default label
func Warning() *Event {
level := levels.LevelWarning
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newDefaultEventWithLevel(levels.LevelWarning)
event.setLevelMetadata(levels.LevelWarning)
return event
}

// Error writes a error message on the screen with the default label
func Error() *Event {
level := levels.LevelError
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newDefaultEventWithLevel(levels.LevelError)
event.setLevelMetadata(levels.LevelError)
return event
}

// Debug writes an error message on the screen with the default label
func Debug() *Event {
level := levels.LevelDebug
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newDefaultEventWithLevel(levels.LevelDebug)
event.setLevelMetadata(levels.LevelDebug)
return event
}

// Fatal exits the program if we encounter a fatal error
func Fatal() *Event {
level := levels.LevelFatal
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newDefaultEventWithLevel(levels.LevelFatal)
event.setLevelMetadata(levels.LevelFatal)
return event
}

// Silent prints a string on stdout without any extra labels.
func Silent() *Event {
level := levels.LevelSilent
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event := newDefaultEventWithLevel(levels.LevelSilent)
event.setLevelMetadata(levels.LevelSilent)
return event
}

// Print prints a string on stderr without any extra labels.
func Print() *Event {
level := levels.LevelInfo
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event := newDefaultEventWithLevel(levels.LevelInfo)
return event
}

// Verbose prints a string only in verbose output mode.
func Verbose() *Event {
level := levels.LevelVerbose
event := &Event{
logger: DefaultLogger,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newDefaultEventWithLevel(levels.LevelVerbose)
event.setLevelMetadata(levels.LevelVerbose)
return event
}

// Info writes a info message on the screen with the default label
func (l *Logger) Info() *Event {
level := levels.LevelInfo
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newEventWithLevelAndLogger(levels.LevelInfo, l)
event.setLevelMetadata(levels.LevelInfo)
return event
}

// Warning writes a warning message on the screen with the default label
func (l *Logger) Warning() *Event {
level := levels.LevelWarning
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newEventWithLevelAndLogger(levels.LevelWarning, l)
event.setLevelMetadata(levels.LevelWarning)
return event
}

// Error writes a error message on the screen with the default label
func (l *Logger) Error() *Event {
level := levels.LevelError
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newEventWithLevelAndLogger(levels.LevelError, l)
event.setLevelMetadata(levels.LevelError)
return event
}

// Debug writes an error message on the screen with the default label
func (l *Logger) Debug() *Event {
level := levels.LevelDebug
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newEventWithLevelAndLogger(levels.LevelDebug, l)
event.setLevelMetadata(levels.LevelDebug)
return event
}

// Fatal exits the program if we encounter a fatal error
func (l *Logger) Fatal() *Event {
level := levels.LevelFatal
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newEventWithLevelAndLogger(levels.LevelFatal, l)
event.setLevelMetadata(levels.LevelFatal)
return event
}

// Print prints a string on screen without any extra labels.
func (l *Logger) Print() *Event {
level := levels.LevelSilent
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
event := newEventWithLevelAndLogger(levels.LevelSilent, l)
return event
}

// Verbose prints a string only in verbose output mode.
func (l *Logger) Verbose() *Event {
level := levels.LevelVerbose
event := &Event{
logger: l,
level: level,
metadata: make(map[string]string),
}
event.metadata["label"] = labels[level]
event := newEventWithLevelAndLogger(levels.LevelVerbose, l)
event.setLevelMetadata(levels.LevelVerbose)
return event
}

Expand Down

0 comments on commit de8b2ac

Please sign in to comment.