logrus.go 5.5 KB
Newer Older
programor_guo's avatar
programor_guo 已提交
1 2 3
package log

import (
4
	"Open_IM/pkg/common/config"
programor_guo's avatar
programor_guo 已提交
5
	"bufio"
programor_guo's avatar
programor_guo 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
	"fmt"
	nested "github.com/antonfisher/nested-logrus-formatter"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
	"os"
	"time"
)

var logger *Logger

type Logger struct {
	*logrus.Logger
	Pid int
}

func init() {
	logger = loggerInit("")

}
func NewPrivateLog(moduleName string) {
	logger = loggerInit(moduleName)
}

func loggerInit(moduleName string) *Logger {
	var logger = logrus.New()
	//All logs will be printed
programor_guo's avatar
programor_guo 已提交
33 34 35 36
	logger.SetLevel(logrus.Level(config.Config.Log.RemainLogLevel))
	//Close std console output
	src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
	if err != nil {
programor_guo's avatar
programor_guo 已提交
37
		panic(err.Error())
programor_guo's avatar
programor_guo 已提交
38 39 40 41
	}
	writer := bufio.NewWriter(src)
	logger.SetOutput(writer)
	//Log Console Print Style Setting
programor_guo's avatar
programor_guo 已提交
42
	logger.SetFormatter(&nested.Formatter{
programor_guo's avatar
programor_guo 已提交
43
		TimestampFormat: "2006-01-02 15:04:05.000",
programor_guo's avatar
programor_guo 已提交
44
		HideKeys:        false,
programor_guo's avatar
programor_guo 已提交
45
		FieldsOrder:     []string{"PID", "FilePath", "OperationID"},
programor_guo's avatar
programor_guo 已提交
46 47 48 49 50
	})
	//File name and line number display hook
	logger.AddHook(newFileHook())

	//Send logs to elasticsearch hook
programor_guo's avatar
programor_guo 已提交
51
	if config.Config.Log.ElasticSearchSwitch {
programor_guo's avatar
programor_guo 已提交
52 53 54
		logger.AddHook(newEsHook(moduleName))
	}
	//Log file segmentation hook
55
	hook := NewLfsHook(time.Duration(config.Config.Log.RotationTime)*time.Hour, config.Config.Log.RemainRotationCount, moduleName)
programor_guo's avatar
programor_guo 已提交
56 57 58 59 60 61
	logger.AddHook(hook)
	return &Logger{
		logger,
		os.Getpid(),
	}
}
62
func NewLfsHook(rotationTime time.Duration, maxRemainNum uint, moduleName string) logrus.Hook {
programor_guo's avatar
programor_guo 已提交
63
	lfsHook := lfshook.NewHook(lfshook.WriterMap{
64 65 66 67
		logrus.DebugLevel: initRotateLogs(rotationTime, maxRemainNum, "debug", moduleName),
		logrus.InfoLevel:  initRotateLogs(rotationTime, maxRemainNum, "info", moduleName),
		logrus.WarnLevel:  initRotateLogs(rotationTime, maxRemainNum, "warn", moduleName),
		logrus.ErrorLevel: initRotateLogs(rotationTime, maxRemainNum, "error", moduleName),
programor_guo's avatar
programor_guo 已提交
68
	}, &nested.Formatter{
programor_guo's avatar
programor_guo 已提交
69
		TimestampFormat: "2006-01-02 15:04:05.000",
programor_guo's avatar
programor_guo 已提交
70
		HideKeys:        false,
programor_guo's avatar
programor_guo 已提交
71
		FieldsOrder:     []string{"PID", "FilePath", "OperationID"},
programor_guo's avatar
programor_guo 已提交
72 73 74
	})
	return lfsHook
}
75
func initRotateLogs(rotationTime time.Duration, maxRemainNum uint, level string, moduleName string) *rotatelogs.RotateLogs {
programor_guo's avatar
programor_guo 已提交
76 77 78
	if moduleName != "" {
		moduleName = moduleName + "."
	}
79
	writer, err := rotatelogs.New(
programor_guo's avatar
programor_guo 已提交
80
		config.Config.Log.StorageLocation+moduleName+level+"."+"%Y-%m-%d",
81 82 83 84
		rotatelogs.WithRotationTime(rotationTime),
		rotatelogs.WithRotationCount(maxRemainNum),
	)
	if err != nil {
programor_guo's avatar
programor_guo 已提交
85
		panic(err.Error())
86 87 88 89
	} else {
		return writer
	}
}
programor_guo's avatar
programor_guo 已提交
90

programor_guo's avatar
programor_guo 已提交
91
//Deprecated
programor_guo's avatar
programor_guo 已提交
92
func Info(token, OperationID, format string, args ...interface{}) {
programor_guo's avatar
programor_guo 已提交
93 94 95 96 97
	logger.WithFields(logrus.Fields{
		"PID":         logger.Pid,
		"OperationID": OperationID,
	}).Infof(format, args...)

programor_guo's avatar
programor_guo 已提交
98 99
}

programor_guo's avatar
programor_guo 已提交
100
//Deprecated
programor_guo's avatar
programor_guo 已提交
101
func Error(token, OperationID, format string, args ...interface{}) {
programor_guo's avatar
programor_guo 已提交
102 103 104 105 106 107

	logger.WithFields(logrus.Fields{
		"PID":         logger.Pid,
		"OperationID": OperationID,
	}).Errorf(format, args...)

programor_guo's avatar
programor_guo 已提交
108 109
}

programor_guo's avatar
programor_guo 已提交
110
//Deprecated
programor_guo's avatar
programor_guo 已提交
111
func Debug(token, OperationID, format string, args ...interface{}) {
programor_guo's avatar
programor_guo 已提交
112 113 114 115 116 117

	logger.WithFields(logrus.Fields{
		"PID":         logger.Pid,
		"OperationID": OperationID,
	}).Debugf(format, args...)

programor_guo's avatar
programor_guo 已提交
118 119
}

programor_guo's avatar
programor_guo 已提交
120
//Deprecated
programor_guo's avatar
programor_guo 已提交
121
func Warning(token, OperationID, format string, args ...interface{}) {
programor_guo's avatar
programor_guo 已提交
122 123 124 125 126
	logger.WithFields(logrus.Fields{
		"PID":         logger.Pid,
		"OperationID": OperationID,
	}).Warningf(format, args...)

programor_guo's avatar
programor_guo 已提交
127 128
}

programor_guo's avatar
programor_guo 已提交
129
//Deprecated
programor_guo's avatar
programor_guo 已提交
130 131 132 133
func InfoByArgs(format string, args ...interface{}) {
	logger.WithFields(logrus.Fields{}).Infof(format, args)
}

programor_guo's avatar
programor_guo 已提交
134
//Deprecated
programor_guo's avatar
programor_guo 已提交
135 136 137 138 139 140 141
func ErrorByArgs(format string, args ...interface{}) {
	logger.WithFields(logrus.Fields{}).Errorf(format, args...)
}

//Print log information in k, v format,
//kv is best to appear in pairs. tipInfo is the log prompt information for printing,
//and kv is the key and value for printing.
programor_guo's avatar
programor_guo 已提交
142
//Deprecated
programor_guo's avatar
programor_guo 已提交
143 144 145 146 147
func InfoByKv(tipInfo, OperationID string, args ...interface{}) {
	fields := make(logrus.Fields)
	argsHandle(OperationID, fields, args)
	logger.WithFields(fields).Info(tipInfo)
}
programor_guo's avatar
programor_guo 已提交
148 149

//Deprecated
programor_guo's avatar
programor_guo 已提交
150 151 152 153 154
func ErrorByKv(tipInfo, OperationID string, args ...interface{}) {
	fields := make(logrus.Fields)
	argsHandle(OperationID, fields, args)
	logger.WithFields(fields).Error(tipInfo)
}
programor_guo's avatar
programor_guo 已提交
155 156

//Deprecated
programor_guo's avatar
programor_guo 已提交
157 158 159 160 161
func DebugByKv(tipInfo, OperationID string, args ...interface{}) {
	fields := make(logrus.Fields)
	argsHandle(OperationID, fields, args)
	logger.WithFields(fields).Debug(tipInfo)
}
programor_guo's avatar
programor_guo 已提交
162 163

//Deprecated
programor_guo's avatar
programor_guo 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
func WarnByKv(tipInfo, OperationID string, args ...interface{}) {
	fields := make(logrus.Fields)
	argsHandle(OperationID, fields, args)
	logger.WithFields(fields).Warn(tipInfo)
}

//internal method
func argsHandle(OperationID string, fields logrus.Fields, args []interface{}) {
	for i := 0; i < len(args); i += 2 {
		if i+1 < len(args) {
			fields[fmt.Sprintf("%v", args[i])] = args[i+1]
		} else {
			fields[fmt.Sprintf("%v", args[i])] = ""
		}
	}
programor_guo's avatar
programor_guo 已提交
179
	fields["OperationID"] = OperationID
programor_guo's avatar
programor_guo 已提交
180 181
	fields["PID"] = logger.Pid
}
programor_guo's avatar
programor_guo 已提交
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
func NewInfo(OperationID string, args ...interface{}) {
	logger.WithFields(logrus.Fields{
		"OperationID": OperationID,
		"PID":         logger.Pid,
	}).Infoln(args)
}
func NewError(OperationID string, args ...interface{}) {
	logger.WithFields(logrus.Fields{
		"OperationID": OperationID,
		"PID":         logger.Pid,
	}).Errorln(args)
}
func NewDebug(OperationID string, args ...interface{}) {
	logger.WithFields(logrus.Fields{
		"OperationID": OperationID,
		"PID":         logger.Pid,
	}).Debugln(args)
}
func NewWarn(OperationID string, args ...interface{}) {
	logger.WithFields(logrus.Fields{
		"OperationID": OperationID,
		"PID":         logger.Pid,
	}).Warnln(args)
}