package main import ( "fmt" "os" "path/filepath" "sync" "time" ) // Logger 简单文件日志(windowsgui 子系统无控制台,统一落盘)。 type Logger struct { mu sync.Mutex file *os.File path string } func NewLogger() *Logger { dir := filepath.Join(appDataDir(), "logs") _ = os.MkdirAll(dir, 0o755) p := filepath.Join(dir, "tray-"+time.Now().Format("20060102")+".log") f, err := os.OpenFile(p, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644) if err != nil { f = nil } return &Logger{file: f, path: p} } func (l *Logger) Printf(format string, args ...any) { l.mu.Lock() defer l.mu.Unlock() line := fmt.Sprintf("[%s] %s\n", time.Now().Format("2006-01-02 15:04:05"), fmt.Sprintf(format, args...)) if l.file != nil { _, _ = l.file.WriteString(line) } } func (l *Logger) Path() string { return l.path } func (l *Logger) Close() { l.mu.Lock() defer l.mu.Unlock() if l.file != nil { _ = l.file.Close() l.file = nil } }