- 文件剪贴板复制剪切粘贴,重名自动副本 - SFTP下载到本机与外部文件拖入,目录递归 - 传输进度浮动面板,transfer-progress事件链 - Drawio预览,Excel工作线程,冻结看门狗 - cmd与bat自写batch语法高亮,psm1等映射补齐
107 lines
2.2 KiB
Go
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)
|
|
}
|
|
}
|
|
|
|
|