From 52391e3be7fe89c7e797a53eb05227da8bb1ce84 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Thu, 21 Feb 2019 10:56:53 -0800 Subject: [PATCH] pkg/logutil: define default zap.Config Signed-off-by: Gyuho Lee --- pkg/logutil/zap.go | 97 +++++++++++++++++++++++++++++++++ pkg/logutil/zap_grpc_test.go | 2 +- pkg/logutil/zap_journal_test.go | 2 +- pkg/logutil/zap_raft_test.go | 2 +- 4 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 pkg/logutil/zap.go diff --git a/pkg/logutil/zap.go b/pkg/logutil/zap.go new file mode 100644 index 000000000..313d914c1 --- /dev/null +++ b/pkg/logutil/zap.go @@ -0,0 +1,97 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "sort" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// DefaultZapLoggerConfig defines default zap logger configuration. +var DefaultZapLoggerConfig = zap.Config{ + Level: zap.NewAtomicLevelAt(zap.InfoLevel), + + Development: false, + Sampling: &zap.SamplingConfig{ + Initial: 100, + Thereafter: 100, + }, + + Encoding: "json", + + // copied from "zap.NewProductionEncoderConfig" with some updates + EncoderConfig: zapcore.EncoderConfig{ + TimeKey: "ts", + LevelKey: "level", + NameKey: "logger", + CallerKey: "caller", + MessageKey: "msg", + StacktraceKey: "stacktrace", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + }, + + // Use "/dev/null" to discard all + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, +} + +// AddOutputPaths adds output paths to the existing output paths, resolving conflicts. +func AddOutputPaths(cfg zap.Config, outputPaths, errorOutputPaths []string) zap.Config { + outputs := make(map[string]struct{}) + for _, v := range cfg.OutputPaths { + outputs[v] = struct{}{} + } + for _, v := range outputPaths { + outputs[v] = struct{}{} + } + outputSlice := make([]string, 0) + if _, ok := outputs["/dev/null"]; ok { + // "/dev/null" to discard all + outputSlice = []string{"/dev/null"} + } else { + for k := range outputs { + outputSlice = append(outputSlice, k) + } + } + cfg.OutputPaths = outputSlice + sort.Strings(cfg.OutputPaths) + + errOutputs := make(map[string]struct{}) + for _, v := range cfg.ErrorOutputPaths { + errOutputs[v] = struct{}{} + } + for _, v := range errorOutputPaths { + errOutputs[v] = struct{}{} + } + errOutputSlice := make([]string, 0) + if _, ok := errOutputs["/dev/null"]; ok { + // "/dev/null" to discard all + errOutputSlice = []string{"/dev/null"} + } else { + for k := range errOutputs { + errOutputSlice = append(errOutputSlice, k) + } + } + cfg.ErrorOutputPaths = errOutputSlice + sort.Strings(cfg.ErrorOutputPaths) + + return cfg +} diff --git a/pkg/logutil/zap_grpc_test.go b/pkg/logutil/zap_grpc_test.go index 7bd71e53b..9e028cac8 100644 --- a/pkg/logutil/zap_grpc_test.go +++ b/pkg/logutil/zap_grpc_test.go @@ -40,7 +40,7 @@ func TestNewGRPCLoggerV2(t *testing.T) { Thereafter: 100, }, Encoding: "json", - EncoderConfig: zap.NewProductionEncoderConfig(), + EncoderConfig: DefaultZapLoggerConfig.EncoderConfig, OutputPaths: []string{logPath}, ErrorOutputPaths: []string{logPath}, } diff --git a/pkg/logutil/zap_journal_test.go b/pkg/logutil/zap_journal_test.go index 29107a5fd..09e39cb6d 100644 --- a/pkg/logutil/zap_journal_test.go +++ b/pkg/logutil/zap_journal_test.go @@ -34,7 +34,7 @@ func TestNewJournalWriter(t *testing.T) { syncer := zapcore.AddSync(jw) cr := zapcore.NewCore( - zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), + zapcore.NewJSONEncoder(DefaultZapLoggerConfig.EncoderConfig), syncer, zap.NewAtomicLevelAt(zap.InfoLevel), ) diff --git a/pkg/logutil/zap_raft_test.go b/pkg/logutil/zap_raft_test.go index c2992ed3e..5724f1916 100644 --- a/pkg/logutil/zap_raft_test.go +++ b/pkg/logutil/zap_raft_test.go @@ -40,7 +40,7 @@ func TestNewRaftLogger(t *testing.T) { Thereafter: 100, }, Encoding: "json", - EncoderConfig: zap.NewProductionEncoderConfig(), + EncoderConfig: DefaultZapLoggerConfig.EncoderConfig, OutputPaths: []string{logPath}, ErrorOutputPaths: []string{logPath}, }