From c6b911c65105af92b8f2f00c58f4af2760c6f690 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Thu, 21 Apr 2022 15:38:24 -0400 Subject: [PATCH] Fix line handling when `caller` is not present, added support for logger name --- .github/workflows/develop.yaml | 4 +-- CHANGELOG.md | 3 +- benchmarks_test.go | 1 + bin/release | 59 ++++++++++++++++++++++++++++++++++ go.mod | 4 +-- main.go | 50 +++++++++++++++++++++++----- main_test.go | 18 +++++++++-- 7 files changed, 124 insertions(+), 15 deletions(-) create mode 100755 bin/release diff --git a/.github/workflows/develop.yaml b/.github/workflows/develop.yaml index c3f2e71..c16342b 100644 --- a/.github/workflows/develop.yaml +++ b/.github/workflows/develop.yaml @@ -11,10 +11,10 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 strategy: matrix: - go: [ '1.15', '1.14' ] + go: [ '1.16', '1.17' ] name: Go ${{ matrix.go }} sample steps: - name: Setup go diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c2fad8..2d1e4ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ -## Unreleased +## 0.3.0 +- [Fix] Fix formatting when `caller` is not present - [Improvement] The flag `-all` (or `--all`) can now be used to show fields that are filtered out by default - [Improvement] More fields are filtered by defaults for Zapdriver format (`labels`, `serviceContext`, `logging.googleapis.com/labels` & `logging.googleapis.com/sourceLocation` are filtered out by default now). - [Fix] Stacktrace are now properly printed when your log format is the Zap production standard one. diff --git a/benchmarks_test.go b/benchmarks_test.go index d5b26c3..d50e560 100644 --- a/benchmarks_test.go +++ b/benchmarks_test.go @@ -17,6 +17,7 @@ func BenchmarkZapdriver(b *testing.B) { b.ResetTimer() b.ReportAllocs() + b.SetBytes(byteCount) for n := 0; n < b.N; n++ { diff --git a/bin/release b/bin/release new file mode 100755 index 0000000..4e7fed9 --- /dev/null +++ b/bin/release @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" + +main() { + pushd "$ROOT" &> /dev/null + + dry_run="true" + + while getopts "hf" opt; do + case $opt in + h) usage && exit 0;; + f) dry_run="false";; + \?) usage_error "Invalid option: -$OPTARG";; + esac + done + shift $((OPTIND-1)) + + version="$1"; shift + + if [[ $version == "" ]]; then + usage_error "parameter is required" + fi + + args="" + if [[ $dry_run == "true" ]]; then + args="--skip-publish" + fi + + goreleaser --rm-dist $args +} + +usage_error() { + message="$1" + exit_code="$2" + + echo "ERROR: $message" + echo "" + usage + exit ${exit_code:-1} +} + +usage() { + echo "usage: release [-f] " + echo "" + echo "Perform the commands necessary to release a new version of the project, mainly" + echo "it does its tasks by calling 'goreleaser' and performing some Git commands." + echo "" + echo "The script runs in dry run automatically unless the '-f' option is provided." + echo "" + echo "Tasks" + echo " ?" + echo "" + echo "" + echo "Options" + echo " -h Display help about this script" +} + +main "$@" \ No newline at end of file diff --git a/go.mod b/go.mod index f5a27e6..39a6dbd 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,9 @@ module github.com/maoueh/zap-pretty +go 1.16 + require ( github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 github.com/stretchr/testify v1.3.0 golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e ) - -go 1.13 diff --git a/main.go b/main.go index 025e7c9..352586c 100644 --- a/main.go +++ b/main.go @@ -189,11 +189,11 @@ func (p *processor) processLine(line string) { } func (p *processor) maybePrettyPrintLine(line string, lineData map[string]interface{}) (string, error) { - if lineData["level"] != nil && lineData["ts"] != nil && lineData["caller"] != nil && lineData["msg"] != nil { + if lineData["level"] != nil && lineData["ts"] != nil && lineData["msg"] != nil { return p.maybePrettyPrintZapLine(line, lineData) } - if lineData["severity"] != nil && (lineData["time"] != nil || lineData["timestamp"] != nil) && lineData["caller"] != nil && lineData["message"] != nil { + if lineData["severity"] != nil && (lineData["time"] != nil || lineData["timestamp"] != nil) && lineData["message"] != nil { return p.maybePrettyPrintZapdriverLine(line, lineData) } @@ -206,13 +206,26 @@ func (p *processor) maybePrettyPrintZapLine(line string, lineData map[string]int return "", fmt.Errorf("unable to process field 'ts': %s", err) } + var caller *string + if v := lineData["caller"]; v != nil { + callerStr := v.(string) + caller = &callerStr + } + + var logger *string + if v := lineData["logger"]; v != nil { + loggerStr := v.(string) + logger = &loggerStr + } + var buffer bytes.Buffer - p.writeHeader(&buffer, logTimestamp, lineData["level"].(string), lineData["caller"].(string), lineData["msg"].(string)) + p.writeHeader(&buffer, logTimestamp, lineData["level"].(string), caller, logger, lineData["msg"].(string)) // Delete standard stuff from data fields delete(lineData, "level") delete(lineData, "ts") delete(lineData, "caller") + delete(lineData, "logger") delete(lineData, "msg") stacktrace := "" @@ -265,12 +278,25 @@ func (p *processor) maybePrettyPrintZapdriverLine(line string, lineData map[stri return "", fmt.Errorf("unable to process field 'time': %s", err) } - p.writeHeader(&buffer, &parsedTime, lineData["severity"].(string), lineData["caller"].(string), lineData["message"].(string)) + var caller *string + if v := lineData["caller"]; v != nil { + callerStr := v.(string) + caller = &callerStr + } + + var logger *string + if v := lineData["logger"]; v != nil { + loggerStr := v.(string) + logger = &loggerStr + } + + p.writeHeader(&buffer, &parsedTime, lineData["severity"].(string), caller, logger, lineData["message"].(string)) // Delete standard stuff from data fields delete(lineData, timeField) delete(lineData, "severity") delete(lineData, "caller") + delete(lineData, "logger") delete(lineData, "message") if !p.showAllFields { @@ -301,14 +327,22 @@ func (p *processor) maybePrettyPrintZapdriverLine(line string, lineData map[stri return buffer.String(), nil } -func (p *processor) writeHeader(buffer *bytes.Buffer, timestamp *time.Time, severity string, caller string, message string) { +func (p *processor) writeHeader(buffer *bytes.Buffer, timestamp *time.Time, severity string, caller *string, logger *string, message string) { buffer.WriteString(fmt.Sprintf("[%s]", timestamp.Format("2006-01-02 15:04:05.000 MST"))) buffer.WriteByte(' ') buffer.WriteString(p.colorizeSeverity(severity).String()) - buffer.WriteByte(' ') - buffer.WriteString(Gray(12, fmt.Sprintf("(%s)", caller)).String()) + if logger != nil && caller != nil { + buffer.WriteByte(' ') + buffer.WriteString(Gray(12, fmt.Sprintf("(%s, %s)", *logger, *caller)).String()) + } else if logger != nil { + buffer.WriteByte(' ') + buffer.WriteString(Gray(12, fmt.Sprintf("(%s)", *logger)).String()) + } else if caller != nil { + buffer.WriteByte(' ') + buffer.WriteString(Gray(12, fmt.Sprintf("(%s)", *caller)).String()) + } buffer.WriteByte(' ') buffer.WriteString(Blue(message).String()) @@ -442,7 +476,7 @@ func (p *processor) colorizeSeverity(severity string) aurora.Value { color = BlueFg } - return Colorize(severity, color) + return Colorize(strings.ToUpper(severity), color) } func (p *processor) unformattedPrintLine(line string, message string, args ...interface{}) { diff --git a/main_test.go b/main_test.go index 39fa5ad..5df0b5c 100644 --- a/main_test.go +++ b/main_test.go @@ -57,7 +57,21 @@ func TestStandardNewProduction(t *testing.T) { `{"level":"info","ts":1545445711.144533,"caller":"c","msg":"m"}`, }, expectedLines: []string{ - "[2018-12-21 21:28:31.144 EST] \x1b[32minfo\x1b[0m \x1b[38;5;244m(c)\x1b[0m \x1b[34mm\x1b[0m", + "[2018-12-21 21:28:31.144 EST] \x1b[32mINFO\x1b[0m \x1b[38;5;244m(c)\x1b[0m \x1b[34mm\x1b[0m", + }, + }, + }) +} + +func TestStandardNewProduction2(t *testing.T) { + runLogTests(t, []logTest{ + { + name: "single_log_line", + lines: []string{ + `{"severity":"INFO","timestamp":"2022-04-21T14:50:18.382974069-04:00","logger":"l","message":"m"}`, + }, + expectedLines: []string{ + "[2022-04-21 14:50:18.382 EDT] \x1b[32mINFO\x1b[0m \x1b[38;5;244m(l)\x1b[0m \x1b[34mm\x1b[0m", }, }, }) @@ -71,7 +85,7 @@ func TestStandardFieldTs_ISO8601_string(t *testing.T) { `{"level":"info","ts":"2019-12-06T19:40:20.627Z","caller":"c","msg":"m"}`, }, expectedLines: []string{ - "[2019-12-06 14:40:20.627 EST] \x1b[32minfo\x1b[0m \x1b[38;5;244m(c)\x1b[0m \x1b[34mm\x1b[0m", + "[2019-12-06 14:40:20.627 EST] \x1b[32mINFO\x1b[0m \x1b[38;5;244m(c)\x1b[0m \x1b[34mm\x1b[0m", }, }, })