Files
nl-video-api/utility/logger/logger.go
2025-08-03 00:11:15 +08:00

241 lines
6.6 KiB
Go

package logger
import (
"context"
"fmt"
"time"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/guid"
)
var (
// 不同类型的日志记录器
InfoLogger *glog.Logger
ErrorLogger *glog.Logger
SQLLogger *glog.Logger
)
// InitLogger 初始化日志系统
func InitLogger() {
// 创建日志目录
createLogDirs()
// 初始化不同类型的日志记录器
InfoLogger = initLoggerByType("log")
ErrorLogger = initLoggerByType("error")
SQLLogger = initLoggerByType("sql")
g.Log().Info(context.Background(), "日志系统初始化完成")
}
// createLogDirs 创建日志目录
func createLogDirs() {
// 创建主日志目录
if err := gfile.Mkdir("logs"); err != nil {
g.Log().Fatalf(context.Background(), "创建主日志目录失败: %v", err)
}
// 创建子目录
dirs := []string{"logs/log", "logs/error", "logs/sql"}
for _, dir := range dirs {
if err := gfile.Mkdir(dir); err != nil {
g.Log().Fatalf(context.Background(), "创建日志目录失败: %v", err)
}
}
}
// initLoggerByType 根据类型初始化日志记录器
func initLoggerByType(logType string) *glog.Logger {
logger := glog.New()
// 生成日志文件名: YYYY_MM_DD_uuid.log
now := time.Now()
uuid := guid.S()
fileName := fmt.Sprintf("%s_%s.log",
now.Format("2006_01_02"),
uuid[:8], // 使用UUID的前8位
)
// 配置日志记录器
logger.SetConfigWithMap(g.Map{
"path": fmt.Sprintf("logs/%s", logType), // 日志目录统一到logs下
"file": fileName, // 日志文件名
"level": "all", // 日志级别
"stdout": true, // 同时输出到控制台
"rotateSize": "5M", // 5MB切割
"rotateExpire": "7d", // 保留7天
"rotateBackupLimit": 10, // 最多保留10个备份文件
"rotateBackupExpire": "30d", // 备份文件保留30天
"rotateBackupCompress": true, // 压缩备份文件
"rotateCheckInterval": "1m", // 每分钟检查一次是否需要切割
})
return logger
}
// LogInfo 记录普通信息日志
func LogInfo(ctx context.Context, format string, args ...interface{}) {
if InfoLogger != nil {
InfoLogger.Infof(ctx, format, args...)
}
}
// LogError 记录错误日志
func LogError(ctx context.Context, format string, args ...interface{}) {
if ErrorLogger != nil {
ErrorLogger.Errorf(ctx, format, args...)
}
}
// LogSQL 记录SQL执行日志
func LogSQL(ctx context.Context, format string, args ...interface{}) {
if SQLLogger != nil {
SQLLogger.Infof(ctx, format, args...)
}
}
// LogDebug 记录调试日志
func LogDebug(ctx context.Context, format string, args ...interface{}) {
if InfoLogger != nil {
InfoLogger.Debugf(ctx, format, args...)
}
}
// LogWarn 记录警告日志
func LogWarn(ctx context.Context, format string, args ...interface{}) {
if InfoLogger != nil {
InfoLogger.Warningf(ctx, format, args...)
}
}
// LogFatal 记录致命错误日志
func LogFatal(ctx context.Context, format string, args ...interface{}) {
if ErrorLogger != nil {
ErrorLogger.Fatalf(ctx, format, args...)
}
}
// LogPanic 记录panic日志
func LogPanic(ctx context.Context, format string, args ...interface{}) {
if ErrorLogger != nil {
ErrorLogger.Panicf(ctx, format, args...)
}
}
// GetLoggerByType 根据类型获取日志记录器
func GetLoggerByType(logType string) *glog.Logger {
switch logType {
case "info", "log":
return InfoLogger
case "error":
return ErrorLogger
case "sql":
return SQLLogger
default:
return InfoLogger
}
}
// LogWithFields 记录带字段的日志
func LogWithFields(ctx context.Context, logType string, level string, message string, fields g.Map) {
logger := GetLoggerByType(logType)
if logger == nil {
return
}
// 构建日志消息
logMsg := message
if len(fields) > 0 {
logMsg += " | Fields: "
for k, v := range fields {
logMsg += fmt.Sprintf("%s=%v ", k, v)
}
}
switch level {
case "debug":
logger.Debug(ctx, logMsg)
case "info":
logger.Info(ctx, logMsg)
case "warn", "warning":
logger.Warning(ctx, logMsg)
case "error":
logger.Error(ctx, logMsg)
case "fatal":
logger.Fatal(ctx, logMsg)
case "panic":
logger.Panic(ctx, logMsg)
default:
logger.Info(ctx, logMsg)
}
}
// LogRequest 记录请求日志
func LogRequest(ctx context.Context, method, uri, ip, userAgent string, duration time.Duration) {
LogInfo(ctx, "请求日志 | Method: %s | URI: %s | IP: %s | UserAgent: %s | Duration: %v",
method, uri, ip, userAgent, duration)
}
// LogResponse 记录响应日志
func LogResponse(ctx context.Context, status int, message string, data interface{}) {
LogInfo(ctx, "响应日志 | Status: %d | Message: %s | HasData: %t",
status, message, data != nil)
}
// LogDatabaseError 记录数据库错误
func LogDatabaseError(ctx context.Context, operation string, sql string, err error) {
LogError(ctx, "数据库错误 | Operation: %s | SQL: %s | Error: %v",
operation, sql, err)
}
// LogDatabaseQuery 记录数据库查询
func LogDatabaseQuery(ctx context.Context, sql string, args []interface{}, duration time.Duration, rowsAffected int64) {
LogSQL(ctx, "SQL执行 | SQL: %s | Args: %v | Duration: %v | RowsAffected: %d",
sql, args, duration, rowsAffected)
}
// LogRedisError 记录Redis错误
func LogRedisError(ctx context.Context, operation string, key string, err error) {
LogError(ctx, "Redis错误 | Operation: %s | Key: %s | Error: %v",
operation, key, err)
}
// LogRedisOperation 记录Redis操作
func LogRedisOperation(ctx context.Context, operation string, key string, value interface{}, duration time.Duration) {
LogInfo(ctx, "Redis操作 | Operation: %s | Key: %s | HasValue: %t | Duration: %v",
operation, key, value != nil, duration)
}
// LogBusinessError 记录业务错误
func LogBusinessError(ctx context.Context, module string, operation string, err error, extra g.Map) {
fields := g.Map{
"module": module,
"operation": operation,
"error": err.Error(),
}
// 合并额外字段
for k, v := range extra {
fields[k] = v
}
LogWithFields(ctx, "error", "error", "业务错误", fields)
}
// LogSystemError 记录系统错误
func LogSystemError(ctx context.Context, component string, err error, extra g.Map) {
fields := g.Map{
"component": component,
"error": err.Error(),
}
// 合并额外字段
for k, v := range extra {
fields[k] = v
}
LogWithFields(ctx, "error", "error", "系统错误", fields)
}