logs.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package logger
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. "github.com/sirupsen/logrus"
  7. )
  8. type Hook struct {
  9. Writer io.Writer
  10. Formatter logrus.Formatter
  11. Level []logrus.Level
  12. }
  13. func (h *Hook) Fire(entry *logrus.Entry) error {
  14. line, err := h.Formatter.Format(entry)
  15. if err != nil {
  16. return err
  17. }
  18. h.Writer.Write(line)
  19. return nil
  20. }
  21. func (h *Hook) Levels() []logrus.Level {
  22. return h.Level
  23. }
  24. func newHook(writer io.Writer, formatter logrus.Formatter, level logrus.Level) *Hook {
  25. var levels []logrus.Level
  26. for _, l := range logrus.AllLevels {
  27. if l <= level {
  28. levels = append(levels, l)
  29. }
  30. }
  31. return &Hook{
  32. Writer: writer,
  33. Formatter: formatter,
  34. Level: levels,
  35. }
  36. }
  37. func Init(logFilePath string, logLevelStr string) *logrus.Logger {
  38. var Logger *logrus.Logger
  39. logLevel, err := logrus.ParseLevel(logLevelStr)
  40. if err != nil {
  41. logLevel = logrus.InfoLevel
  42. log.Printf("Invalid log level: %s. Defaulting to info", logLevelStr)
  43. }
  44. Logger = logrus.New()
  45. Logger.SetOutput(io.Discard)
  46. logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
  47. if err != nil {
  48. log.Printf("Failed to open log file: %s", logFilePath)
  49. panic(err)
  50. }
  51. Logger.AddHook(newHook(
  52. logFile,
  53. &logrus.JSONFormatter{},
  54. logLevel,
  55. ))
  56. Logger.AddHook(newHook(
  57. os.Stderr,
  58. &logrus.TextFormatter{
  59. FullTimestamp: true,
  60. ForceColors: true,
  61. },
  62. logLevel,
  63. ))
  64. return Logger
  65. }