Source File
global.go
Belonging Package
go.uber.org/zap
// Copyright (c) 2016 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package zap
import (
)
const (
_stdLogDefaultDepth = 1
_loggerWriterDepth = 2
_programmerErrorTemplate = "You've found a bug in zap! Please file a bug at " +
"https://github.com/uber-go/zap/issues/new and reference this error: %v"
)
var (
_globalMu sync.RWMutex
_globalL = NewNop()
_globalS = _globalL.Sugar()
)
// L returns the global Logger, which can be reconfigured with ReplaceGlobals.
// It's safe for concurrent use.
func () *Logger {
_globalMu.RLock()
:= _globalL
_globalMu.RUnlock()
return
}
// S returns the global SugaredLogger, which can be reconfigured with
// ReplaceGlobals. It's safe for concurrent use.
func () *SugaredLogger {
_globalMu.RLock()
:= _globalS
_globalMu.RUnlock()
return
}
// ReplaceGlobals replaces the global Logger and SugaredLogger, and returns a
// function to restore the original values. It's safe for concurrent use.
func ( *Logger) func() {
_globalMu.Lock()
:= _globalL
_globalL =
_globalS = .Sugar()
_globalMu.Unlock()
return func() { () }
}
// NewStdLog returns a *log.Logger which writes to the supplied zap Logger at
// InfoLevel. To redirect the standard library's package-global logging
// functions, use RedirectStdLog instead.
func ( *Logger) *log.Logger {
:= .WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth))
:= .Info
return log.New(&loggerWriter{}, "" /* prefix */, 0 /* flags */)
}
// NewStdLogAt returns *log.Logger which writes to supplied zap logger at
// required level.
func ( *Logger, zapcore.Level) (*log.Logger, error) {
:= .WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth))
, := levelToFunc(, )
if != nil {
return nil,
}
return log.New(&loggerWriter{}, "" /* prefix */, 0 /* flags */), nil
}
// RedirectStdLog redirects output from the standard library's package-global
// logger to the supplied logger at InfoLevel. Since zap already handles caller
// annotations, timestamps, etc., it automatically disables the standard
// library's annotations and prefixing.
//
// It returns a function to restore the original prefix and flags and reset the
// standard library's output to os.Stderr.
func ( *Logger) func() {
, := redirectStdLogAt(, InfoLevel)
if != nil {
// Can't get here, since passing InfoLevel to redirectStdLogAt always
// works.
panic(fmt.Sprintf(_programmerErrorTemplate, ))
}
return
}
// RedirectStdLogAt redirects output from the standard library's package-global
// logger to the supplied logger at the specified level. Since zap already
// handles caller annotations, timestamps, etc., it automatically disables the
// standard library's annotations and prefixing.
//
// It returns a function to restore the original prefix and flags and reset the
// standard library's output to os.Stderr.
func ( *Logger, zapcore.Level) (func(), error) {
return redirectStdLogAt(, )
}
func ( *Logger, zapcore.Level) (func(), error) {
:= log.Flags()
:= log.Prefix()
log.SetFlags(0)
log.SetPrefix("")
:= .WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth))
, := levelToFunc(, )
if != nil {
return nil,
}
log.SetOutput(&loggerWriter{})
return func() {
log.SetFlags()
log.SetPrefix()
log.SetOutput(os.Stderr)
}, nil
}
func ( *Logger, zapcore.Level) (func(string, ...Field), error) {
switch {
case DebugLevel:
return .Debug, nil
case InfoLevel:
return .Info, nil
case WarnLevel:
return .Warn, nil
case ErrorLevel:
return .Error, nil
case DPanicLevel:
return .DPanic, nil
case PanicLevel:
return .Panic, nil
case FatalLevel:
return .Fatal, nil
}
return nil, fmt.Errorf("unrecognized level: %q", )
}
type loggerWriter struct {
logFunc func(msg string, fields ...Field)
}
func ( *loggerWriter) ( []byte) (int, error) {
= bytes.TrimSpace()
.logFunc(string())
return len(), nil
}
The pages are generated with Golds v0.4.9. (GOOS=linux GOARCH=amd64)