1 Star 0 Fork 0

yangwood/novacore

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
recoverPanic.go 2.44 KB
一键复制 编辑 原始数据 按行查看 历史
linyuan 提交于 2025-12-26 19:59 +08:00 . fix: add panic recorver
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())))
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/yangwood/novacore.git
git@gitee.com:yangwood/novacore.git
yangwood
novacore
novacore
v1.2.92

搜索帮助