// 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 zapimport ()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 (_globalMusync.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()returnfunc() { () }}// 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)) := .Inforeturnlog.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 {returnnil, }returnlog.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) {returnredirectStdLogAt(, )}func ( *Logger, zapcore.Level) (func(), error) { := log.Flags() := log.Prefix()log.SetFlags(0)log.SetPrefix("") := .WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) , := levelToFunc(, )if != nil {returnnil, }log.SetOutput(&loggerWriter{})returnfunc() {log.SetFlags()log.SetPrefix()log.SetOutput(os.Stderr) }, nil}func ( *Logger, zapcore.Level) (func(string, ...Field), error) {switch {caseDebugLevel:return .Debug, nilcaseInfoLevel:return .Info, nilcaseWarnLevel:return .Warn, nilcaseErrorLevel:return .Error, nilcaseDPanicLevel:return .DPanic, nilcasePanicLevel:return .Panic, nilcaseFatalLevel:return .Fatal, nil }returnnil, fmt.Errorf("unrecognized level: %q", )}typeloggerWriterstruct {logFuncfunc(msg string, fields ...Field)}func ( *loggerWriter) ( []byte) (int, error) { = bytes.TrimSpace() .logFunc(string())returnlen(), nil}
The pages are generated with Goldsv0.6.7. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds.