logger.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package logger
  2. import (
  3. "fmt"
  4. "os"
  5. "sort"
  6. "strconv"
  7. "strings"
  8. "sync"
  9. "time"
  10. )
  11. const TimeFormatDay = "2006-01-02"
  12. const TimeFormat = "2006-01-02 15:04:05"
  13. var currentLogs = make(map[string]string)
  14. func makeString(message ...string) string {
  15. return strings.Join(message, " ")
  16. }
  17. func getVerbose() int32 {
  18. level, err := strconv.Atoi(os.Getenv("VERBOSITY"))
  19. if err != nil || level < 0 {
  20. level = 0
  21. }
  22. if level > 3 {
  23. level = 3
  24. }
  25. return int32(level)
  26. }
  27. // ResetLogs - reallocates logs map
  28. func ResetLogs() {
  29. currentLogs = make(map[string]string)
  30. }
  31. // Log - handles adding logs
  32. func Log(verbosity int, message ...string) {
  33. var mu sync.Mutex
  34. mu.Lock()
  35. defer mu.Unlock()
  36. var currentTime = time.Now()
  37. var currentMessage = makeString(message...)
  38. if int32(verbosity) <= getVerbose() && getVerbose() >= 0 {
  39. fmt.Printf("[netmaker] %s %s \n", currentTime.Format(TimeFormat), currentMessage)
  40. }
  41. currentLogs[currentMessage] = currentTime.Format("2006-01-02 15:04:05.999999999")
  42. }
  43. // Dump - dumps all logs into a formatted string
  44. func Dump() string {
  45. var dumpString = ""
  46. type keyVal struct {
  47. Key string
  48. Value time.Time
  49. }
  50. var dumpLogs = make([]keyVal, 0, len(currentLogs))
  51. for key, value := range currentLogs {
  52. parsedTime, err := time.Parse(TimeFormat, value)
  53. if err == nil {
  54. dumpLogs = append(dumpLogs, keyVal{
  55. Key: key,
  56. Value: parsedTime,
  57. })
  58. }
  59. }
  60. sort.Slice(dumpLogs, func(i, j int) bool {
  61. return dumpLogs[i].Value.Before(dumpLogs[j].Value)
  62. })
  63. for i := range dumpLogs {
  64. var currLog = dumpLogs[i]
  65. dumpString += fmt.Sprintf("[netmaker] %s %s \n", currLog.Value.Format(TimeFormat), currLog.Key)
  66. }
  67. return dumpString
  68. }
  69. // DumpFile - appends log dump log file
  70. func DumpFile(filePath string) {
  71. f, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
  72. if err != nil {
  73. panic(err)
  74. }
  75. defer f.Close()
  76. if _, err = f.WriteString(Dump()); err != nil {
  77. panic(err)
  78. }
  79. }
  80. // Retrieve - retrieves logs from given file
  81. func Retrieve(filePath string) string {
  82. contents, err := os.ReadFile(filePath)
  83. if err != nil {
  84. panic(err)
  85. }
  86. return string(contents)
  87. }
  88. // FatalLog - exits os after logging
  89. func FatalLog(message ...string) {
  90. fmt.Printf("[netmaker] Fatal: %s \n", makeString(message...))
  91. os.Exit(2)
  92. }