代码拉取完成,页面将自动刷新
package tools
import (
"context"
"os"
"path/filepath"
"runtime/debug"
"sync"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
var (
panicLogger *zap.Logger
panicOnce sync.Once
panicMu sync.RWMutex
)
// initPanicLogger 初始化 panic logger
func initPanicLogger() {
panicMu.Lock()
defer panicMu.Unlock()
if panicLogger != nil {
return
}
panicLogPath := "logs/panic.log"
logDir := filepath.Dir(panicLogPath)
if logDir != "." && logDir != "" {
_ = os.MkdirAll(logDir, 0755)
}
hook := lumberjack.Logger{
Filename: panicLogPath,
MaxSize: 100, // 100MB
MaxBackups: 10, // 保留10个备份
MaxAge: 30, // 保留30天
Compress: true, // 压缩旧日志
}
fileSyncer := zapcore.AddSync(&hook)
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "linenum",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.FullCallerEncoder,
EncodeName: zapcore.FullNameEncoder,
}
core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderConfig), fileSyncer, zapcore.ErrorLevel)
panicLogger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
}
// getPanicLogger 获取 panic logger
func getPanicLogger() *zap.Logger {
panicOnce.Do(initPanicLogger)
panicMu.RLock()
defer panicMu.RUnlock()
return panicLogger
}
// RecoverPanic 捕获 panic 并记录日志
func RecoverPanic(ctx context.Context) {
if err := recover(); err != nil {
// 写入 panic.log 文件
panicLogger := getPanicLogger()
if panicLogger != nil {
var traceID string
if traceIDValue := ctx.Value(TraceIDKey{}); traceIDValue != nil {
if tid, ok := traceIDValue.(string); ok {
traceID = tid
}
}
fields := []zap.Field{
zap.Any("error", err),
zap.String("stack", string(debug.Stack())),
}
if traceID != "" {
fields = append(fields, zap.String("trace_id", traceID))
}
panicLogger.Error("RecoverPanic", fields...)
}
// 同时写入普通日志(保持原有行为)
logger := WithTraceID(ctx.Value(TraceIDKey{}).(string))
if logger != nil {
logger.Error("RecoverPanic", zap.Any("error", err), zap.String("stack", string(debug.Stack())))
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。