重构:文件系统模块化架构,优化应用启动流程
This commit is contained in:
177
internal/filesystem/logger.go
Normal file
177
internal/filesystem/logger.go
Normal file
@@ -0,0 +1,177 @@
|
||||
package filesystem
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// LogLevel 日志级别
|
||||
type LogLevel int
|
||||
|
||||
const (
|
||||
LogLevelDebug LogLevel = iota
|
||||
LogLevelInfo
|
||||
LogLevelWarn
|
||||
LogLevelError
|
||||
)
|
||||
|
||||
// Logger 结构化日志记录器
|
||||
type Logger struct {
|
||||
minLevel LogLevel
|
||||
logFile *os.File
|
||||
logPath string
|
||||
mu sync.Mutex
|
||||
prefix string
|
||||
}
|
||||
|
||||
// NewLogger 创建新的日志记录器
|
||||
func NewLogger(logPath string, minLevel LogLevel) (*Logger, error) {
|
||||
// 创建日志目录
|
||||
if err := os.MkdirAll(filepath.Dir(logPath), 0755); err != nil {
|
||||
return nil, fmt.Errorf("创建日志目录失败: %w", err)
|
||||
}
|
||||
|
||||
// 打开日志文件
|
||||
logFile, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("打开日志文件失败: %w", err)
|
||||
}
|
||||
|
||||
return &Logger{
|
||||
minLevel: minLevel,
|
||||
logFile: logFile,
|
||||
logPath: logPath,
|
||||
prefix: "[FileSystem]",
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Close 关闭日志记录器
|
||||
func (l *Logger) Close() error {
|
||||
l.mu.Lock()
|
||||
defer l.mu.Unlock()
|
||||
|
||||
if l.logFile != nil {
|
||||
return l.logFile.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Debug 记录调试日志
|
||||
func (l *Logger) Debug(format string, args ...interface{}) {
|
||||
l.log(LogLevelDebug, "DEBUG", format, args...)
|
||||
}
|
||||
|
||||
// Info 记录信息日志
|
||||
func (l *Logger) Info(format string, args ...interface{}) {
|
||||
l.log(LogLevelInfo, "INFO", format, args...)
|
||||
}
|
||||
|
||||
// Warn 记录警告日志
|
||||
func (l *Logger) Warn(format string, args ...interface{}) {
|
||||
l.log(LogLevelWarn, "WARN", format, args...)
|
||||
}
|
||||
|
||||
// Error 记录错误日志
|
||||
func (l *Logger) Error(format string, args ...interface{}) {
|
||||
l.log(LogLevelError, "ERROR", format, args...)
|
||||
}
|
||||
|
||||
// log 内部日志记录方法
|
||||
func (l *Logger) log(level LogLevel, levelStr, format string, args ...interface{}) {
|
||||
if level < l.minLevel {
|
||||
return
|
||||
}
|
||||
|
||||
l.mu.Lock()
|
||||
defer l.mu.Unlock()
|
||||
|
||||
// 格式化消息
|
||||
msg := fmt.Sprintf(format, args...)
|
||||
timestamp := time.Now().Format("2006-01-02 15:04:05.000")
|
||||
|
||||
// 写入日志文件
|
||||
logLine := fmt.Sprintf("%s %s %s %s\n", timestamp, l.prefix, levelStr, msg)
|
||||
if l.logFile != nil {
|
||||
if _, err := l.logFile.WriteString(logLine); err != nil {
|
||||
// 日志写入失败,输出到控制台
|
||||
log.Print(logLine)
|
||||
}
|
||||
}
|
||||
|
||||
// 根据级别决定是否输出到控制台
|
||||
if level >= LogLevelWarn {
|
||||
log.Print(logLine)
|
||||
}
|
||||
}
|
||||
|
||||
// LogOperation 记录操作日志(辅助函数)
|
||||
func LogOperation(operation, path string, success bool, err error) {
|
||||
logger := GetGlobalLogger()
|
||||
if logger == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if success {
|
||||
logger.Info("操作: %s %s - 成功", operation, path)
|
||||
} else {
|
||||
logger.Error("操作: %s %s - 失败: %v", operation, path, err)
|
||||
}
|
||||
}
|
||||
|
||||
// LogError 记录错误日志(辅助函数)
|
||||
func LogError(operation string, path string, err error) {
|
||||
logger := GetGlobalLogger()
|
||||
if logger == nil {
|
||||
return
|
||||
}
|
||||
|
||||
logger.Error("错误: %s %s - %v", operation, path, err)
|
||||
|
||||
// 如果是调试模式,输出堆栈跟踪
|
||||
if os.Getenv("UDESK_DEBUG") == "1" {
|
||||
logger.Debug("堆栈:\n%s", GetStackTrace(2))
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 全局日志记录器(向后兼容)==========
|
||||
|
||||
var (
|
||||
globalLogger *Logger
|
||||
loggerOnce sync.Once
|
||||
)
|
||||
|
||||
// InitLogger 初始化全局日志记录器
|
||||
func InitLogger(logDir string, minLevel LogLevel) error {
|
||||
var initErr error
|
||||
loggerOnce.Do(func() {
|
||||
timestamp := time.Now().Format("2006-01-02")
|
||||
logPath := filepath.Join(logDir, fmt.Sprintf("filesystem_%s.log", timestamp))
|
||||
|
||||
logger, err := NewLogger(logPath, minLevel)
|
||||
if err != nil {
|
||||
initErr = err
|
||||
return
|
||||
}
|
||||
|
||||
globalLogger = logger
|
||||
log.Printf("[日志系统] 已启动,日志文件: %s", logPath)
|
||||
})
|
||||
return initErr
|
||||
}
|
||||
|
||||
// GetGlobalLogger 获取全局日志记录器
|
||||
func GetGlobalLogger() *Logger {
|
||||
return globalLogger
|
||||
}
|
||||
|
||||
// CloseLogger 关闭全局日志记录器
|
||||
func CloseLogger() error {
|
||||
if globalLogger != nil {
|
||||
return globalLogger.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user