Brak opisu
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.9KB

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