146 lines
3.0 KiB
Go
146 lines
3.0 KiB
Go
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...)
|
|
}
|
|
|
|
// 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
|
|
)
|
|
|
|
// GetGlobalLogger 获取全局日志记录器
|
|
func GetGlobalLogger() *Logger {
|
|
return globalLogger
|
|
}
|
|
|