mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 05:56:38 +08:00
b76f707c8b
Result: {"status":"keep","total_issues":74,"golint_canonicalheader":8,"golint_errname":1,"golint_errorlint":12,"golint_forcetypeassert":3,"golint_gosec":0,"golint_intrange":3,"golint_modernize":5,"golint_nilnil":3,"golint_perfsprint":18,"golint_prealloc":3,"golint_recvcheck":7,"golint_usestdlibvars":3,"golint_wastedassign":7,"golint_total":73,"eslint_problems":1,"eslint_errors":0,"eslint_warnings":1,"tsc_errors":0,"measure_s":38}
103 lines
2.5 KiB
Go
103 lines
2.5 KiB
Go
// Copyright 2025 linux.do
|
|
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package logger
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/uptrace/opentelemetry-go-extra/otelzap"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
)
|
|
|
|
// Config represents the logging configuration.
|
|
type Config struct {
|
|
Level string
|
|
Format string
|
|
Output string
|
|
FilePath string
|
|
MaxSize int
|
|
MaxAge int
|
|
MaxBackups int
|
|
Compress bool
|
|
}
|
|
|
|
var logger *otelzap.Logger
|
|
|
|
// ringBufferCapacity 环形缓冲区容量
|
|
const ringBufferCapacity = 5000
|
|
|
|
// GlobalRingBuffer 全局日志环形缓冲区,供 Admin 日志查询和 WebSocket 推送使用
|
|
var GlobalRingBuffer *LogRingBuffer
|
|
|
|
func doInit(cfg Config) {
|
|
logWriter, err := getLogWriterForConfig(cfg)
|
|
if err != nil {
|
|
log.Fatalf("[Logger] get log writer err: %v\n", err)
|
|
}
|
|
|
|
// 初始化 ring buffer(保留最近 5000 行日志),如果是多次调用 Init,不需要重复创建 GlobalRingBuffer
|
|
if GlobalRingBuffer == nil {
|
|
GlobalRingBuffer = NewLogRingBuffer(ringBufferCapacity)
|
|
}
|
|
|
|
// 使用 multi writer 同时写入原始输出和 ring buffer
|
|
multiWriter := zapcore.NewMultiWriteSyncer(
|
|
logWriter,
|
|
zapcore.AddSync(GlobalRingBuffer),
|
|
)
|
|
|
|
zapLogger := zap.New(
|
|
zapcore.NewCore(getEncoderForConfig(cfg), multiWriter, getLogLevelForConfig(cfg)),
|
|
zap.AddCaller(),
|
|
zap.AddCallerSkip(1),
|
|
)
|
|
logger = otelzap.New(
|
|
zapLogger,
|
|
otelzap.WithMinLevel(zapLogger.Level()),
|
|
)
|
|
}
|
|
|
|
func init() {
|
|
// 默认使用 console stdout INFO 日志输出,避免在 Init 前或测试中发生空指针崩溃
|
|
defaultCfg := Config{
|
|
Level: "info",
|
|
Format: "console",
|
|
Output: "stdout",
|
|
}
|
|
doInit(defaultCfg)
|
|
}
|
|
|
|
// Init initializes the logger with a custom configuration.
|
|
func Init(cfg Config) {
|
|
doInit(cfg)
|
|
}
|
|
|
|
// DebugF 输出 Debug 级别日志
|
|
func DebugF(ctx context.Context, format string, args ...any) {
|
|
msg := fmt.Sprintf(format, args...)
|
|
logger.Ctx(ctx).Debug(msg, getTraceIDFields(ctx)...)
|
|
}
|
|
|
|
// InfoF 输出 Info 级别日志
|
|
func InfoF(ctx context.Context, format string, args ...any) {
|
|
msg := fmt.Sprintf(format, args...)
|
|
logger.Ctx(ctx).Info(msg, getTraceIDFields(ctx)...)
|
|
}
|
|
|
|
// WarnF 输出 Warn 级别日志
|
|
func WarnF(ctx context.Context, format string, args ...any) {
|
|
msg := fmt.Sprintf(format, args...)
|
|
logger.Ctx(ctx).Warn(msg, getTraceIDFields(ctx)...)
|
|
}
|
|
|
|
// ErrorF 输出 Error 级别日志
|
|
func ErrorF(ctx context.Context, format string, args ...any) {
|
|
msg := fmt.Sprintf(format, args...)
|
|
logger.Ctx(ctx).Error(msg, getTraceIDFields(ctx)...)
|
|
}
|