Bez popisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

boot_logger.go 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // logger/boot_logger.go
  2. package logger
  3. import (
  4. "fmt"
  5. "io"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. "time"
  10. )
  11. var (
  12. bootLogFile *os.File
  13. bootLogger *log.Logger
  14. )
  15. // InitBootLogger 初始化启动日志(只在启动阶段使用)
  16. func InitBootLog(serviceName string) error {
  17. // 1. 确保日志目录存在
  18. logDir := "logs/boot"
  19. if err := os.MkdirAll(logDir, 0755); err != nil {
  20. return fmt.Errorf("创建日志目录失败: %v", err)
  21. }
  22. // 2. 创建启动日志文件
  23. timestamp := time.Now().Format("20060102-150405")
  24. filename := fmt.Sprintf("boot-%s-%s.log", serviceName, timestamp)
  25. filePath := filepath.Join(logDir, filename)
  26. file, err := os.Create(filePath)
  27. if err != nil {
  28. return fmt.Errorf("创建启动日志文件失败: %v", err)
  29. }
  30. bootLogFile = file
  31. // 3. 创建专门的bootLogger,同时输出到文件和控制台
  32. multiWriter := io.MultiWriter(os.Stdout, bootLogFile)
  33. bootLogger = log.New(multiWriter, "", log.LstdFlags|log.Lshortfile)
  34. // 4. 重定向标准库log到bootLogger(重要!)
  35. log.SetOutput(multiWriter)
  36. log.SetFlags(log.LstdFlags | log.Lshortfile)
  37. // 5. 记录启动信息
  38. BootLog("=== 服务启动开始 ===")
  39. BootLog("服务名称: %s", serviceName)
  40. BootLog("启动时间: %s", time.Now().Format("2006-01-02 15:04:05"))
  41. BootLog("启动日志文件: %s", filePath)
  42. return nil
  43. }
  44. // BootLog 启动阶段专用日志函数
  45. func BootLog(format string, v ...interface{}) {
  46. if bootLogger != nil {
  47. // 使用bootLogger记录
  48. bootLogger.Printf(format, v...)
  49. } else {
  50. // 后备:直接使用标准库log
  51. log.Printf(format, v...)
  52. }
  53. }
  54. // CloseBootLogger 关闭启动日志,切换到运行日志
  55. func CloseBootLogger() {
  56. if bootLogger != nil {
  57. BootLog("=== 启动阶段结束,切换到运行时日志 ===")
  58. }
  59. if bootLogFile != nil {
  60. bootLogFile.Close()
  61. bootLogFile = nil
  62. }
  63. bootLogger = nil
  64. }