Files
u-desk/internal/filesystem/logger.go
T
lxy e7a2c5148e 新增: 文件操作增强与预览扩展
- 文件剪贴板复制剪切粘贴,重名自动副本
- SFTP下载到本机与外部文件拖入,目录递归
- 传输进度浮动面板,transfer-progress事件链
- Drawio预览,Excel工作线程,冻结看门狗
- cmd与bat自写batch语法高亮,psm1等映射补齐
2026-09-15 22:26:12 +08:00

107 lines
2.2 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)
}
}