mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
优化日志,新增rotatelogs库支持
This commit is contained in:
112
log/log.go
112
log/log.go
@@ -1,31 +1,37 @@
|
|||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/duanhf2012/rotatelogs"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"go.uber.org/zap/zapcore"
|
"go.uber.org/zap/zapcore"
|
||||||
"gopkg.in/natefinch/lumberjack.v2"
|
"gopkg.in/natefinch/lumberjack.v2"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var isSetLogger bool
|
var isSetLogger bool
|
||||||
var gLogger = NewDefaultLogger()
|
var gLogger = NewDefaultLogger()
|
||||||
|
var LogLevel zapcore.Level
|
||||||
|
var MaxSize int
|
||||||
|
var LogPath string
|
||||||
|
var OpenConsole *bool
|
||||||
|
var LogChanLen int
|
||||||
|
|
||||||
type Logger struct {
|
type Logger struct {
|
||||||
*zap.Logger
|
*zap.Logger
|
||||||
stack bool
|
stack bool
|
||||||
|
|
||||||
OpenConsole *bool
|
FileName string
|
||||||
LogPath string
|
Skip int
|
||||||
FileName string
|
Encoder zapcore.Encoder
|
||||||
Skip int
|
SugaredLogger *zap.SugaredLogger
|
||||||
LogLevel zapcore.Level
|
CoreList []zapcore.Core
|
||||||
Encoder zapcore.Encoder
|
WriteSyncerFun []func() zapcore.WriteSyncer
|
||||||
LogConfig *lumberjack.Logger
|
|
||||||
SugaredLogger *zap.SugaredLogger
|
|
||||||
CoreList []zapcore.Core
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置Logger
|
||||||
func SetLogger(logger *Logger) {
|
func SetLogger(logger *Logger) {
|
||||||
if logger != nil {
|
if logger != nil {
|
||||||
gLogger = logger
|
gLogger = logger
|
||||||
@@ -33,6 +39,15 @@ func SetLogger(logger *Logger) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置ZapLogger
|
||||||
|
func SetZapLogger(zapLogger *zap.Logger) {
|
||||||
|
if zapLogger != nil {
|
||||||
|
gLogger = &Logger{}
|
||||||
|
gLogger.Logger = zapLogger
|
||||||
|
isSetLogger = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func GetLogger() *Logger {
|
func GetLogger() *Logger {
|
||||||
return gLogger
|
return gLogger
|
||||||
}
|
}
|
||||||
@@ -47,8 +62,8 @@ func (logger *Logger) SetSkip(skip int) {
|
|||||||
|
|
||||||
func GetJsonEncoder() zapcore.Encoder {
|
func GetJsonEncoder() zapcore.Encoder {
|
||||||
encoderConfig := zap.NewProductionEncoderConfig()
|
encoderConfig := zap.NewProductionEncoderConfig()
|
||||||
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
|
|
||||||
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
|
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
|
||||||
|
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
|
||||||
encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
||||||
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
|
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
|
||||||
}
|
}
|
||||||
@@ -67,51 +82,100 @@ func GetTxtEncoder() zapcore.Encoder {
|
|||||||
return zapcore.NewConsoleEncoder(encoderConfig)
|
return zapcore.NewConsoleEncoder(encoderConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLogConfig() *lumberjack.Logger {
|
func (logger *Logger) getLogConfig() *lumberjack.Logger {
|
||||||
return &lumberjack.Logger{
|
return &lumberjack.Logger{
|
||||||
Filename: "",
|
Filename: filepath.Join(LogPath, logger.FileName),
|
||||||
MaxSize: 2048,
|
MaxSize: MaxSize,
|
||||||
MaxBackups: 0,
|
MaxBackups: 0,
|
||||||
MaxAge: 0,
|
MaxAge: 0,
|
||||||
Compress: false,
|
Compress: false,
|
||||||
|
LocalTime: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDefaultLogger() *Logger {
|
func NewDefaultLogger() *Logger {
|
||||||
logger := Logger{}
|
logger := Logger{}
|
||||||
logger.Encoder = GetJsonEncoder()
|
logger.Encoder = GetJsonEncoder()
|
||||||
logger.LogConfig = getLogConfig()
|
core := zapcore.NewCore(logger.Encoder, zapcore.AddSync(os.Stdout), zap.InfoLevel)
|
||||||
logger.LogConfig.LocalTime = true
|
logger.Logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
|
||||||
|
|
||||||
logger.Init()
|
|
||||||
return &logger
|
return &logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func (logger *Logger) SetLogLevel(level zapcore.Level) {
|
func (logger *Logger) SetSyncers(syncers ...func() zapcore.WriteSyncer) {
|
||||||
logger.LogLevel = level
|
logger.WriteSyncerFun = syncers
|
||||||
|
}
|
||||||
|
|
||||||
|
func (logger *Logger) AppendSyncerFun(syncerFun func() zapcore.WriteSyncer) {
|
||||||
|
logger.WriteSyncerFun = append(logger.WriteSyncerFun, syncerFun)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetLogLevel(level zapcore.Level) {
|
||||||
|
LogLevel = level
|
||||||
}
|
}
|
||||||
|
|
||||||
func (logger *Logger) Enabled(zapcore.Level) bool {
|
func (logger *Logger) Enabled(zapcore.Level) bool {
|
||||||
return logger.stack
|
return logger.stack
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (logger *Logger) NewLumberjackWriter() zapcore.WriteSyncer {
|
||||||
|
return zapcore.AddSync(
|
||||||
|
&lumberjack.Logger{
|
||||||
|
Filename: filepath.Join(LogPath, logger.FileName),
|
||||||
|
MaxSize: MaxSize,
|
||||||
|
MaxBackups: 0,
|
||||||
|
MaxAge: 0,
|
||||||
|
Compress: false,
|
||||||
|
LocalTime: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (logger *Logger) NewRotatelogsWriter() zapcore.WriteSyncer {
|
||||||
|
var options []rotatelogs.Option
|
||||||
|
|
||||||
|
if MaxSize > 0 {
|
||||||
|
options = append(options, rotatelogs.WithRotateMaxSize(int64(MaxSize)))
|
||||||
|
}
|
||||||
|
if LogChanLen > 0 {
|
||||||
|
options = append(options, rotatelogs.WithChannelLen(LogChanLen))
|
||||||
|
}
|
||||||
|
options = append(options, rotatelogs.WithRotationTime(time.Hour*24))
|
||||||
|
|
||||||
|
fileName := strings.TrimRight(logger.FileName, filepath.Ext(logger.FileName))
|
||||||
|
rotateLogs, err := rotatelogs.NewRotateLogs(LogPath, "20060102/"+fileName+"_20060102_150405", options...)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return zapcore.AddSync(rotateLogs)
|
||||||
|
}
|
||||||
|
|
||||||
func (logger *Logger) Init() {
|
func (logger *Logger) Init() {
|
||||||
if isSetLogger {
|
if isSetLogger {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var syncerList []zapcore.WriteSyncer
|
||||||
|
if logger.WriteSyncerFun == nil {
|
||||||
|
syncerList = append(syncerList, logger.NewLumberjackWriter())
|
||||||
|
} else {
|
||||||
|
for _, syncer := range logger.WriteSyncerFun {
|
||||||
|
syncerList = append(syncerList, syncer())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var coreList []zapcore.Core
|
var coreList []zapcore.Core
|
||||||
if logger.OpenConsole == nil || *logger.OpenConsole {
|
if OpenConsole == nil || *OpenConsole {
|
||||||
core := zapcore.NewCore(logger.Encoder, zapcore.AddSync(os.Stdout), logger.LogLevel)
|
syncerList = append(syncerList, zapcore.AddSync(os.Stdout))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, writer := range syncerList {
|
||||||
|
core := zapcore.NewCore(logger.Encoder, writer, LogLevel)
|
||||||
coreList = append(coreList, core)
|
coreList = append(coreList, core)
|
||||||
}
|
}
|
||||||
|
|
||||||
if logger.CoreList != nil {
|
if logger.CoreList != nil {
|
||||||
coreList = append(coreList, logger.CoreList...)
|
coreList = append(coreList, logger.CoreList...)
|
||||||
}else if logger.LogPath != "" {
|
|
||||||
WriteSyncer := zapcore.AddSync(logger.LogConfig)
|
|
||||||
core := zapcore.NewCore(logger.Encoder, WriteSyncer, logger.LogLevel)
|
|
||||||
coreList = append(coreList, core)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
core := zapcore.NewTee(coreList...)
|
core := zapcore.NewTee(coreList...)
|
||||||
|
|||||||
40
node/node.go
40
node/node.go
@@ -17,7 +17,6 @@ import (
|
|||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
@@ -59,6 +58,7 @@ func init() {
|
|||||||
console.RegisterCommandString("loglevel", "debug", "<-loglevel debug|info|warn|error|stackerror|fatal> Set loglevel.", setLevel)
|
console.RegisterCommandString("loglevel", "debug", "<-loglevel debug|info|warn|error|stackerror|fatal> Set loglevel.", setLevel)
|
||||||
console.RegisterCommandString("logpath", "", "<-logpath path> Set log file path.", setLogPath)
|
console.RegisterCommandString("logpath", "", "<-logpath path> Set log file path.", setLogPath)
|
||||||
console.RegisterCommandInt("logsize", 0, "<-logsize size> Set log size(MB).", setLogSize)
|
console.RegisterCommandInt("logsize", 0, "<-logsize size> Set log size(MB).", setLogSize)
|
||||||
|
console.RegisterCommandInt("logchanlen", 0, "<-logchanlen len> Set log channel len.", setLogChanLen)
|
||||||
console.RegisterCommandString("pprof", "", "<-pprof ip:port> Open performance analysis.", setPprof)
|
console.RegisterCommandString("pprof", "", "<-pprof ip:port> Open performance analysis.", setPprof)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,7 +220,7 @@ func initNode(id string) {
|
|||||||
|
|
||||||
func initLog() error {
|
func initLog() error {
|
||||||
logger := log.GetLogger()
|
logger := log.GetLogger()
|
||||||
if logger.LogPath == "" {
|
if log.LogPath == "" {
|
||||||
err := setLogPath("./log")
|
err := setLogPath("./log")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -230,7 +230,6 @@ func initLog() error {
|
|||||||
localNodeInfo := cluster.GetCluster().GetLocalNodeInfo()
|
localNodeInfo := cluster.GetCluster().GetLocalNodeInfo()
|
||||||
fileName := fmt.Sprintf("%s.log", localNodeInfo.NodeId)
|
fileName := fmt.Sprintf("%s.log", localNodeInfo.NodeId)
|
||||||
logger.FileName = fileName
|
logger.FileName = fileName
|
||||||
logger.LogConfig.Filename = filepath.Join(logger.LogPath, logger.FileName)
|
|
||||||
|
|
||||||
logger.Init()
|
logger.Init()
|
||||||
return nil
|
return nil
|
||||||
@@ -440,10 +439,10 @@ func openConsole(args interface{}) error {
|
|||||||
strOpen := strings.ToLower(strings.TrimSpace(args.(string)))
|
strOpen := strings.ToLower(strings.TrimSpace(args.(string)))
|
||||||
if strOpen == "false" {
|
if strOpen == "false" {
|
||||||
bOpenConsole := false
|
bOpenConsole := false
|
||||||
log.GetLogger().OpenConsole = &bOpenConsole
|
log.OpenConsole = &bOpenConsole
|
||||||
} else if strOpen == "true" {
|
} else if strOpen == "true" {
|
||||||
bOpenConsole := true
|
bOpenConsole := true
|
||||||
log.GetLogger().OpenConsole = &bOpenConsole
|
log.OpenConsole = &bOpenConsole
|
||||||
} else {
|
} else {
|
||||||
return errors.New("parameter console error")
|
return errors.New("parameter console error")
|
||||||
}
|
}
|
||||||
@@ -458,17 +457,17 @@ func setLevel(args interface{}) error {
|
|||||||
strlogLevel := strings.TrimSpace(args.(string))
|
strlogLevel := strings.TrimSpace(args.(string))
|
||||||
switch strlogLevel {
|
switch strlogLevel {
|
||||||
case "debug":
|
case "debug":
|
||||||
log.GetLogger().LogLevel = zapcore.DebugLevel
|
log.LogLevel = zapcore.DebugLevel
|
||||||
case "info":
|
case "info":
|
||||||
log.GetLogger().LogLevel = zapcore.InfoLevel
|
log.LogLevel = zapcore.InfoLevel
|
||||||
case "warn":
|
case "warn":
|
||||||
log.GetLogger().LogLevel = zapcore.WarnLevel
|
log.LogLevel = zapcore.WarnLevel
|
||||||
case "error":
|
case "error":
|
||||||
log.GetLogger().LogLevel = zapcore.ErrorLevel
|
log.LogLevel = zapcore.ErrorLevel
|
||||||
case "stackerror":
|
case "stackerror":
|
||||||
log.GetLogger().LogLevel = zapcore.ErrorLevel
|
log.LogLevel = zapcore.ErrorLevel
|
||||||
case "fatal":
|
case "fatal":
|
||||||
log.GetLogger().LogLevel = zapcore.FatalLevel
|
log.LogLevel = zapcore.FatalLevel
|
||||||
default:
|
default:
|
||||||
return errors.New("unknown level: " + strlogLevel)
|
return errors.New("unknown level: " + strlogLevel)
|
||||||
}
|
}
|
||||||
@@ -481,7 +480,7 @@ func setLogPath(args interface{}) error {
|
|||||||
}
|
}
|
||||||
logPath := strings.TrimSpace(args.(string))
|
logPath := strings.TrimSpace(args.(string))
|
||||||
dir, err := os.Stat(logPath)
|
dir, err := os.Stat(logPath)
|
||||||
if err == nil && dir.IsDir() == false {
|
if err != nil || dir.IsDir() == false {
|
||||||
return errors.New("Not found dir " + logPath)
|
return errors.New("Not found dir " + logPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,7 +491,7 @@ func setLogPath(args interface{}) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.GetLogger().LogPath = logPath
|
log.LogPath = logPath
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,7 +504,20 @@ func setLogSize(args interface{}) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
log.GetLogger().LogConfig.MaxSize = logSize
|
log.MaxSize = logSize
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setLogChanLen(args interface{}) error {
|
||||||
|
logChanLen, ok := args.(int)
|
||||||
|
if ok == false {
|
||||||
|
return errors.New("param logsize is error")
|
||||||
|
}
|
||||||
|
if logChanLen == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
log.LogChanLen = logChanLen
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user