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  }