Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support for optional timestamp addition to debug logs #30

Merged
merged 5 commits into from Jan 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions examples/basic/basic.go
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
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