44 "context"
55 "errors"
66 "fmt"
7+ "os"
78 "strings"
89 "syscall"
910
@@ -18,6 +19,11 @@ type Config struct {
1819
1920type contextKey struct {}
2021
22+ const (
23+ formatJSON = "json"
24+ formatConsole = "console"
25+ )
26+
2127func New (cfg Config ) (* zap.Logger , error ) {
2228 zapCfg , err := buildZapConfig (cfg )
2329 if err != nil {
@@ -30,9 +36,9 @@ func buildZapConfig(cfg Config) (zap.Config, error) {
3036 format := strings .ToLower (strings .TrimSpace (cfg .Format ))
3137 var zapCfg zap.Config
3238 switch format {
33- case "json" :
39+ case formatJSON :
3440 zapCfg = zap .NewProductionConfig ()
35- case "console" :
41+ case formatConsole :
3642 zapCfg = zap .NewDevelopmentConfig ()
3743 default :
3844 return zap.Config {}, fmt .Errorf ("logger: unsupported format %s" , cfg .Format )
@@ -43,6 +49,14 @@ func buildZapConfig(cfg Config) (zap.Config, error) {
4349 }
4450 zapCfg .Level = zap .NewAtomicLevelAt (level )
4551 zapCfg .Encoding = format
52+ encoder := buildEncoderConfig (format )
53+ zapCfg .EncoderConfig = encoder
54+ zapCfg .OutputPaths = []string {"stdout" }
55+ zapCfg .ErrorOutputPaths = []string {"stderr" }
56+ return zapCfg , nil
57+ }
58+
59+ func buildEncoderConfig (format string ) zapcore.EncoderConfig {
4660 encoder := zapcore.EncoderConfig {
4761 TimeKey : "ts" ,
4862 LevelKey : "level" ,
@@ -56,13 +70,36 @@ func buildZapConfig(cfg Config) (zap.Config, error) {
5670 EncodeDuration : zapcore .SecondsDurationEncoder ,
5771 EncodeCaller : zapcore .ShortCallerEncoder ,
5872 }
59- if format == "console" {
60- encoder .EncodeLevel = zapcore .CapitalColorLevelEncoder
73+ if format == formatConsole {
74+ if isCI () {
75+ encoder .EncodeLevel = zapcore .CapitalLevelEncoder
76+ encoder .EncodeTime = zapcore .RFC3339TimeEncoder
77+ } else {
78+ encoder .EncodeLevel = zapcore .CapitalColorLevelEncoder
79+ }
6180 }
62- zapCfg .EncoderConfig = encoder
63- zapCfg .OutputPaths = []string {"stdout" }
64- zapCfg .ErrorOutputPaths = []string {"stderr" }
65- return zapCfg , nil
81+ return encoder
82+ }
83+
84+ func isCI () bool {
85+ ciEnvVars := []string {
86+ "CI" ,
87+ "CONTINUOUS_INTEGRATION" ,
88+ "GITHUB_ACTIONS" ,
89+ "GITLAB_CI" ,
90+ "CIRCLECI" ,
91+ "TRAVIS" ,
92+ "JENKINS_URL" ,
93+ "BUILDKITE" ,
94+ "DRONE" ,
95+ "TEAMCITY_VERSION" ,
96+ }
97+ for _ , envVar := range ciEnvVars {
98+ if os .Getenv (envVar ) != "" {
99+ return true
100+ }
101+ }
102+ return false
66103}
67104
68105func parseLevel (level string ) (zapcore.Level , error ) {
0 commit comments