logger.go 2.2 KB

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