Merge pull request #10409 from nolouch/add-logger

embed: add zap logger builder
This commit is contained in:
Gyuho Lee 2019-01-17 11:21:52 -08:00 committed by GitHub
commit cbfe0b4b79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 30 deletions

View File

@ -301,6 +301,9 @@ type Config struct {
// Debug is true, to enable debug level logging. // Debug is true, to enable debug level logging.
Debug bool `json:"debug"` Debug bool `json:"debug"`
// ZapLoggerBuilder is used to build the zap logger.
ZapLoggerBuilder func(*Config) error
// logger logs server-side operations. The default is nil, // logger logs server-side operations. The default is nil,
// and "setupLogging" must be called before starting server. // and "setupLogging" must be called before starting server.
// Do not set logger directly. // Do not set logger directly.

View File

@ -186,28 +186,29 @@ func (cfg *Config) setupLogging() error {
lcfg.Level = zap.NewAtomicLevelAt(zap.DebugLevel) lcfg.Level = zap.NewAtomicLevelAt(zap.DebugLevel)
grpc.EnableTracing = true grpc.EnableTracing = true
} }
if cfg.ZapLoggerBuilder == nil {
var err error cfg.ZapLoggerBuilder = func(c *Config) error {
cfg.logger, err = lcfg.Build() var err error
if err != nil { c.logger, err = lcfg.Build()
return err if err != nil {
} return err
}
cfg.loggerConfig = &lcfg c.loggerMu.Lock()
cfg.loggerCore = nil defer c.loggerMu.Unlock()
cfg.loggerWriteSyncer = nil c.loggerConfig = &lcfg
c.loggerCore = nil
grpcLogOnce.Do(func() { c.loggerWriteSyncer = nil
// debug true, enable info, warning, error grpcLogOnce.Do(func() {
// debug false, only discard info // debug true, enable info, warning, error
var gl grpclog.LoggerV2 // debug false, only discard info
gl, err = logutil.NewGRPCLoggerV2(lcfg) var gl grpclog.LoggerV2
if err == nil { gl, err = logutil.NewGRPCLoggerV2(lcfg)
grpclog.SetLoggerV2(gl) if err == nil {
grpclog.SetLoggerV2(gl)
}
})
return nil
} }
})
if err != nil {
return err
} }
} else { } else {
if len(cfg.LogOutputs) > 1 { if len(cfg.LogOutputs) > 1 {
@ -237,17 +238,26 @@ func (cfg *Config) setupLogging() error {
syncer, syncer,
lvl, lvl,
) )
cfg.logger = zap.New(cr, zap.AddCaller(), zap.ErrorOutput(syncer)) if cfg.ZapLoggerBuilder == nil {
cfg.ZapLoggerBuilder = func(c *Config) error {
c.logger = zap.New(cr, zap.AddCaller(), zap.ErrorOutput(syncer))
c.loggerMu.Lock()
defer c.loggerMu.Unlock()
c.loggerConfig = nil
c.loggerCore = cr
c.loggerWriteSyncer = syncer
cfg.loggerConfig = nil grpcLogOnce.Do(func() {
cfg.loggerCore = cr grpclog.SetLoggerV2(logutil.NewGRPCLoggerV2FromZapCore(cr, syncer))
cfg.loggerWriteSyncer = syncer })
return nil
grpcLogOnce.Do(func() { }
grpclog.SetLoggerV2(logutil.NewGRPCLoggerV2FromZapCore(cr, syncer)) }
}) }
err := cfg.ZapLoggerBuilder(cfg)
if err != nil {
return err
} }
logTLSHandshakeFailure := func(conn *tls.Conn, err error) { logTLSHandshakeFailure := func(conn *tls.Conn, err error) {
state := conn.ConnectionState() state := conn.ConnectionState()
remoteAddr := conn.RemoteAddr().String() remoteAddr := conn.RemoteAddr().String()
@ -284,3 +294,20 @@ func (cfg *Config) setupLogging() error {
return nil return nil
} }
// NewZapCoreLoggerBuilder generates a zap core logger builder.
func NewZapCoreLoggerBuilder(lg *zap.Logger, cr zapcore.Core, syncer zapcore.WriteSyncer) func(*Config) error {
return func(cfg *Config) error {
cfg.loggerMu.Lock()
defer cfg.loggerMu.Unlock()
cfg.logger = lg
cfg.loggerConfig = nil
cfg.loggerCore = cr
cfg.loggerWriteSyncer = syncer
grpcLogOnce.Do(func() {
grpclog.SetLoggerV2(logutil.NewGRPCLoggerV2FromZapCore(cr, syncer))
})
return nil
}
}