logger.go 961 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "sync"
  7. "time"
  8. )
  9. // Logger 简单文件日志(windowsgui 子系统无控制台,统一落盘)。
  10. type Logger struct {
  11. mu sync.Mutex
  12. file *os.File
  13. path string
  14. }
  15. func NewLogger() *Logger {
  16. dir := filepath.Join(appDataDir(), "logs")
  17. _ = os.MkdirAll(dir, 0o755)
  18. p := filepath.Join(dir, "tray-"+time.Now().Format("20060102")+".log")
  19. f, err := os.OpenFile(p, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644)
  20. if err != nil {
  21. f = nil
  22. }
  23. return &Logger{file: f, path: p}
  24. }
  25. func (l *Logger) Printf(format string, args ...any) {
  26. l.mu.Lock()
  27. defer l.mu.Unlock()
  28. line := fmt.Sprintf("[%s] %s\n", time.Now().Format("2006-01-02 15:04:05"), fmt.Sprintf(format, args...))
  29. if l.file != nil {
  30. _, _ = l.file.WriteString(line)
  31. }
  32. }
  33. func (l *Logger) Path() string {
  34. return l.path
  35. }
  36. func (l *Logger) Close() {
  37. l.mu.Lock()
  38. defer l.mu.Unlock()
  39. if l.file != nil {
  40. _ = l.file.Close()
  41. l.file = nil
  42. }
  43. }