Sin descripción
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 2.0KB

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