优化结构
This commit is contained in:
+12
-1
@@ -433,7 +433,18 @@ func newZapHandler(root, filename string, options Options, errorSink *errorSinkS
|
||||
for _, module := range options.FileOnlyModules {
|
||||
fileOnly[module] = struct{}{}
|
||||
}
|
||||
consoleCore := zapcore.NewCore(outputEncoder.Clone(), zapcore.AddSync(os.Stdout), levelEnabler)
|
||||
// Files stay structured JSON for searching and the log viewer. The console
|
||||
// gets a compact human-readable encoder so entries do not become one long
|
||||
// JSON line that extends far beyond the terminal viewport.
|
||||
consoleEncoderConfig := zap.NewProductionEncoderConfig()
|
||||
consoleEncoderConfig.EncodeTime = func(value time.Time, output zapcore.PrimitiveArrayEncoder) {
|
||||
output.AppendString(options.Prefix + value.Format("2006-01-02 15:04:05.000"))
|
||||
}
|
||||
consoleEncoderConfig.EncodeLevel = zapcore.LowercaseColorLevelEncoder
|
||||
consoleEncoderConfig.EncodeCaller = zapcore.FullCallerEncoder
|
||||
consoleEncoderConfig.ConsoleSeparator = " "
|
||||
consoleEncoder := zapcore.NewConsoleEncoder(consoleEncoderConfig)
|
||||
consoleCore := zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), levelEnabler)
|
||||
core = zapcore.NewTee(fileCore, &moduleFilterCore{Core: consoleCore, fileOnly: fileOnly})
|
||||
}
|
||||
routed := &routedFileCore{base: core, encoder: outputEncoder.Clone(), level: levelEnabler, root: root, retentionDay: options.RetentionDay, state: &routedFileState{writers: map[string]*DailyWriter{}}, errorSink: errorSink}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
@@ -61,6 +62,21 @@ func TestZapHandlerRoutesHTTPAndErrorLogs(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestConsoleEncoderDoesNotChangeJSONFileEncoder(t *testing.T) {
|
||||
config := zap.NewProductionEncoderConfig()
|
||||
config.EncodeTime = zapcore.RFC3339NanoTimeEncoder
|
||||
fileEncoder := zapcore.NewJSONEncoder(config)
|
||||
entry := zapcore.Entry{Level: zapcore.InfoLevel, Time: time.Date(2026, 8, 21, 16, 30, 0, 0, time.Local), Message: "started"}
|
||||
buffer, err := fileEncoder.EncodeEntry(entry, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer buffer.Free()
|
||||
if !strings.HasPrefix(buffer.String(), "{") || !strings.Contains(buffer.String(), `"msg":"started"`) {
|
||||
t.Fatalf("file encoder is no longer JSON: %s", buffer.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestZapHandlerRecordsEveryErrorThroughSink(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
var entries []ErrorEntry
|
||||
|
||||
Reference in New Issue
Block a user