logger.go 2.2 KB

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