/
log.go
132 lines (110 loc) · 3.01 KB
/
log.go
1
2
3
4
5
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package log 日志相关接口以及函数
package log
import (
"os"
"github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/types"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
var (
// 保存日志处理器的引用,方便后续调整日志信息,而不重新初始化
fileHandler *log15.Handler
consoleHandler *log15.Handler
)
func init() {
//resetWithLogLevel("error")
}
//SetLogLevel 设置控制台日志输出级别
func SetLogLevel(logLevel string) {
handler := getConsoleLogHandler(logLevel)
(*handler).SetMaxLevel(int(getLevel(logLevel)))
log15.Root().SetHandler(*handler)
}
//SetFileLog 设置文件日志和控制台日志信息
func SetFileLog(log *types.Log) {
if log == nil {
log = &types.Log{LogFile: "logs/chain33.log"}
}
if log.LogFile == "" {
SetLogLevel(log.LogConsoleLevel)
} else {
resetLog(log)
}
}
// 清空原来所有的日志Handler,根据配置文件信息重置文件和控制台日志
func resetLog(log *types.Log) {
fillDefaultValue(log)
log15.Root().SetHandler(log15.MultiHandler(*getConsoleLogHandler(log.LogConsoleLevel), *getFileLogHandler(log)))
}
// 保证默认性况下为error级别,防止打印太多日志
func fillDefaultValue(log *types.Log) {
if log.Loglevel == "" {
log.Loglevel = log15.LvlError.String()
}
if log.LogConsoleLevel == "" {
log.LogConsoleLevel = log15.LvlError.String()
}
}
func isWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
func getConsoleLogHandler(logLevel string) *log15.Handler {
if consoleHandler != nil {
return consoleHandler
}
format := log15.TerminalFormat()
if isWindows() {
format = log15.LogfmtFormat()
}
stdouth := log15.LvlFilterHandler(
getLevel(logLevel),
log15.StreamHandler(os.Stdout, format),
)
consoleHandler = &stdouth
return &stdouth
}
func getFileLogHandler(log *types.Log) *log15.Handler {
if fileHandler != nil {
return fileHandler
}
rotateLogger := &lumberjack.Logger{
Filename: log.LogFile,
MaxSize: int(log.MaxFileSize),
MaxBackups: int(log.MaxBackups),
MaxAge: int(log.MaxAge),
LocalTime: log.LocalTime,
Compress: log.Compress,
}
fileh := log15.LvlFilterHandler(
getLevel(log.Loglevel),
log15.StreamHandler(rotateLogger, log15.LogfmtFormat()),
)
// 增加打印调用源文件、方法和代码行的判断
if log.CallerFile {
fileh = log15.CallerFileHandler(fileh)
}
if log.CallerFunction {
fileh = log15.CallerFuncHandler(fileh)
}
fileHandler = &fileh
return &fileh
}
func getLevel(lvlString string) log15.Lvl {
lvl, err := log15.LvlFromString(lvlString)
if err != nil {
// 日志级别配置不正确时默认为error级别
return log15.LvlError
}
return lvl
}
//New new
func New(ctx ...interface{}) log15.Logger {
return NewMain(ctx...)
}
//NewMain new
func NewMain(ctx ...interface{}) log15.Logger {
return log15.Root().New(ctx...)
}