github.com/gigforks/mattermost-server@v4.9.1-0.20180619094218-800d97fa55d0+incompatible/mlog/log.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package mlog 5 6 import ( 7 "log" 8 "os" 9 10 "go.uber.org/zap" 11 "go.uber.org/zap/zapcore" 12 "gopkg.in/natefinch/lumberjack.v2" 13 ) 14 15 const ( 16 // Very verbose messages for debugging specific issues 17 LevelDebug = "debug" 18 // Default log level, informational 19 LevelInfo = "info" 20 // Warnings are messages about possible issues 21 LevelWarn = "warn" 22 // Errors are messages about things we know are problems 23 LevelError = "error" 24 ) 25 26 // Type and function aliases from zap to limit the libraries scope into MM code 27 type Field = zapcore.Field 28 29 var Int64 = zap.Int64 30 var Int = zap.Int 31 var String = zap.String 32 var Any = zap.Any 33 var Err = zap.Error 34 35 type LoggerConfiguration struct { 36 EnableConsole bool 37 ConsoleJson bool 38 ConsoleLevel string 39 EnableFile bool 40 FileJson bool 41 FileLevel string 42 FileLocation string 43 } 44 45 type Logger struct { 46 zap *zap.Logger 47 consoleLevel zap.AtomicLevel 48 fileLevel zap.AtomicLevel 49 } 50 51 func getZapLevel(level string) zapcore.Level { 52 switch level { 53 case LevelInfo: 54 return zapcore.InfoLevel 55 case LevelWarn: 56 return zapcore.WarnLevel 57 case LevelDebug: 58 return zapcore.DebugLevel 59 case LevelError: 60 return zapcore.ErrorLevel 61 default: 62 return zapcore.InfoLevel 63 } 64 } 65 66 func NewLogger(config *LoggerConfiguration) *Logger { 67 cores := []zapcore.Core{} 68 logger := &Logger{ 69 consoleLevel: zap.NewAtomicLevelAt(getZapLevel(config.ConsoleLevel)), 70 fileLevel: zap.NewAtomicLevelAt(getZapLevel(config.FileLevel)), 71 } 72 73 encoderConfig := zap.NewProductionEncoderConfig() 74 var encoder zapcore.Encoder 75 if config.ConsoleJson { 76 encoder = zapcore.NewJSONEncoder(encoderConfig) 77 } else { 78 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder 79 encoder = zapcore.NewConsoleEncoder(encoderConfig) 80 } 81 82 if config.EnableConsole { 83 writer := zapcore.Lock(os.Stdout) 84 core := zapcore.NewCore(encoder, writer, logger.consoleLevel) 85 cores = append(cores, core) 86 } 87 88 if config.EnableFile { 89 writer := zapcore.AddSync(&lumberjack.Logger{ 90 Filename: config.FileLocation, 91 MaxSize: 100, 92 Compress: true, 93 }) 94 core := zapcore.NewCore(encoder, writer, logger.fileLevel) 95 cores = append(cores, core) 96 } 97 98 combinedCore := zapcore.NewTee(cores...) 99 100 logger.zap = zap.New(combinedCore, 101 zap.AddCallerSkip(2), 102 zap.AddCaller(), 103 ) 104 105 return logger 106 } 107 108 func (l *Logger) ChangeLevels(config *LoggerConfiguration) { 109 l.consoleLevel.SetLevel(getZapLevel(config.ConsoleLevel)) 110 l.fileLevel.SetLevel(getZapLevel(config.FileLevel)) 111 } 112 113 func (l *Logger) SetConsoleLevel(level string) { 114 l.consoleLevel.SetLevel(getZapLevel(level)) 115 } 116 117 func (l *Logger) With(fields ...Field) *Logger { 118 newlogger := *l 119 newlogger.zap = newlogger.zap.With(fields...) 120 return &newlogger 121 } 122 123 func (l *Logger) StdLog(fields ...Field) *log.Logger { 124 return zap.NewStdLog(l.With(fields...).zap.WithOptions(getStdLogOption())) 125 } 126 127 func (l *Logger) Debug(message string, fields ...Field) { 128 l.zap.Debug(message, fields...) 129 } 130 131 func (l *Logger) Info(message string, fields ...Field) { 132 l.zap.Info(message, fields...) 133 } 134 135 func (l *Logger) Warn(message string, fields ...Field) { 136 l.zap.Warn(message, fields...) 137 } 138 139 func (l *Logger) Error(message string, fields ...Field) { 140 l.zap.Error(message, fields...) 141 } 142 143 func (l *Logger) Critical(message string, fields ...Field) { 144 l.zap.Error(message, fields...) 145 }