From a4fbb8cc5501e735565085b0cf41524e9cb46200 Mon Sep 17 00:00:00 2001 From: Rodrigo Martell Date: Wed, 23 Oct 2024 10:46:07 +1000 Subject: [PATCH] feat/message-formatter-from-event --- README.md | 15 +++++++++++++++ console.go | 28 +++++++++++++++++----------- console_test.go | 14 +++++++++++++- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 1306a6c1..1332ff31 100644 --- a/README.md +++ b/README.md @@ -352,6 +352,21 @@ output.FormatLevel = func(i interface{}) string { output.FormatMessage = func(i interface{}) string { return fmt.Sprintf("***%s****", i) } +output.FormatMessageFromEvent = func(evt map[string]interface{}) zerolog.Formatter { + return func(i interface{}) string { + level := evt[zerolog.LevelFieldName] + switch level { + case zerolog.LevelInfoValue: + return fmt.Sprintf("=> %s %s", level, i) + case zerolog.LevelWarnValue: + return fmt.Sprintf("!! %s %s", level, i) + case zerolog.LevelErrorValue, zerolog.LevelFatalValue, zerolog.LevelPanicValue: + return fmt.Sprintf("XX %s %s", level, i) + default: + return fmt.Sprintf("%s", i) + } + } +} output.FormatFieldName = func(i interface{}) string { return fmt.Sprintf("%s:", i) } diff --git a/console.go b/console.go index 7e65e86f..d03e36e7 100644 --- a/console.go +++ b/console.go @@ -47,6 +47,9 @@ const ( // Formatter transforms the input into a formatted string. type Formatter func(interface{}) string +// FormatterFromEvent generates a Formatter from an event. +type FormatterFromEvent func(map[string]interface{}) Formatter + // ConsoleWriter parses the JSON input and writes it in an // (optionally) colorized, human-friendly format to Out. type ConsoleWriter struct { @@ -77,14 +80,15 @@ type ConsoleWriter struct { // FieldsExclude defines contextual fields to not display in output. FieldsExclude []string - FormatTimestamp Formatter - FormatLevel Formatter - FormatCaller Formatter - FormatMessage Formatter - FormatFieldName Formatter - FormatFieldValue Formatter - FormatErrFieldName Formatter - FormatErrFieldValue Formatter + FormatTimestamp Formatter + FormatLevel Formatter + FormatCaller Formatter + FormatMessage Formatter + FormatMessageFromEvent FormatterFromEvent + FormatFieldName Formatter + FormatFieldValue Formatter + FormatErrFieldName Formatter + FormatErrFieldValue Formatter FormatExtra func(map[string]interface{}, *bytes.Buffer) error @@ -305,10 +309,12 @@ func (w ConsoleWriter) writePart(buf *bytes.Buffer, evt map[string]interface{}, f = w.FormatTimestamp } case MessageFieldName: - if w.FormatMessage == nil { - f = consoleDefaultFormatMessage(w.NoColor, evt[LevelFieldName]) - } else { + if w.FormatMessageFromEvent != nil { + f = w.FormatMessageFromEvent(evt) + } else if w.FormatMessage != nil { f = w.FormatMessage + } else { + f = consoleDefaultFormatMessage(w.NoColor, evt[LevelFieldName]) } case CallerFieldName: if w.FormatCaller == nil { diff --git a/console_test.go b/console_test.go index 179dfeef..7d8c7d41 100644 --- a/console_test.go +++ b/console_test.go @@ -24,10 +24,22 @@ func ExampleConsoleWriter_customFormatters() { out.FormatLevel = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("%-6s|", i)) } out.FormatFieldName = func(i interface{}) string { return fmt.Sprintf("%s:", i) } out.FormatFieldValue = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("%s", i)) } + out.FormatMessageFromEvent = func(evt map[string]interface{}) zerolog.Formatter { + return func(i interface{}) string { + level := evt[zerolog.LevelFieldName] + switch level { + case zerolog.LevelInfoValue, zerolog.LevelWarnValue, zerolog.LevelErrorValue, zerolog.LevelFatalValue, zerolog.LevelPanicValue: + return fmt.Sprintf("%s (%q formatted message)", i, level) + default: + return fmt.Sprintf("%s", i) + } + } + } + log := zerolog.New(out) log.Info().Str("foo", "bar").Msg("Hello World") - // Output: INFO | Hello World foo:BAR + // Output: INFO | Hello World ("info" formatted message) foo:BAR } func ExampleNewConsoleWriter() {