-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.go
164 lines (144 loc) · 4.38 KB
/
logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
* Project: Application Utility Library
* Filename: /logger.go
* Created Date: Sunday September 3rd 2023 18:22:42 +0800
* Author: Sallehuddin Abdul Latif (sallehuddin@berrypay.com)
* Company: BerryPay (M) Sdn. Bhd.
* --------------------------------------
* Last Modified: Monday September 4th 2023 13:00:49 +0800
* Modified By: Sallehuddin Abdul Latif (sallehuddin@berrypay.com)
* --------------------------------------
* Copyright (c) 2023 BerryPay (M) Sdn. Bhd.
*/
package apputil
import (
"fmt"
"os"
"path/filepath"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
var Logger *zap.Logger
var SLogger *zap.SugaredLogger
var ZapLevel zapcore.Level
var AppZapConfig zapcore.EncoderConfig
var AppZapCore zapcore.Core
var AppZapFileEncoder zapcore.Encoder
var AppZapConsoleEncoder zapcore.Encoder
var AppZapWriter zapcore.WriteSyncer
func init() {
logBaseDir, present := os.LookupEnv("LOG_BASE_DIR")
if present {
if logBaseDir != "" {
InitializeLogger(128, 3, 28, true, logBaseDir)
return
}
}
InitializeLogger(128, 3, 28, true, "")
}
func InitializeLogger(maxSize int, maxBackups int, maxAge int, compress bool, logBaseDir string) {
AppZapConfig = zap.NewProductionEncoderConfig()
AppZapConfig.EncodeTime = zapcore.ISO8601TimeEncoder
AppZapFileEncoder = zapcore.NewJSONEncoder(AppZapConfig)
AppZapConsoleEncoder = zapcore.NewConsoleEncoder(AppZapConfig)
exePath, err := os.Executable()
if err != nil {
panic(err)
}
exeName := filepath.Base(exePath)
logFilename := exeName + ".log"
logDir := filepath.Join(filepath.Dir(exePath), "logs")
if logBaseDir != "" {
logDir = filepath.Join(filepath.Dir(exePath), "logs")
}
logPath := filepath.Join(logDir, logFilename)
// Check if directory exists
_, err = os.Stat(filepath.Dir(logPath))
if os.IsNotExist(err) {
// Create directory if it does not exist
err := os.MkdirAll(filepath.Dir(logPath), 0755)
if err != nil {
panic(err)
}
} else if err != nil {
panic(err)
}
// Check if file exists
if _, err := os.Stat(logPath); !os.IsNotExist(err) {
currentTime := time.Now()
formattedTime := currentTime.Format("20060102150405")
if err := os.Rename(logPath, filepath.Join(logDir, exeName+"-"+formattedTime+".log")); err != nil {
fmt.Printf("Error renaming pre-existing log file: %v\n", err)
} else {
fmt.Println("Pre-existing log file renamed successfully.")
}
}
AppZapWriter = zapcore.AddSync(&lumberjack.Logger{
Filename: logPath,
MaxSize: maxSize, // size in megabytes
MaxBackups: maxBackups, // # of backups
MaxAge: maxAge, // # of days
Compress: compress,
})
envLogLevel := os.Getenv("LOG_LEVEL")
switch envLogLevel {
case "debug":
ZapLevel = zapcore.DebugLevel
case "info":
ZapLevel = zapcore.InfoLevel
case "warn":
ZapLevel = zapcore.WarnLevel
case "error":
ZapLevel = zapcore.ErrorLevel
case "panic":
ZapLevel = zapcore.PanicLevel
case "fatal":
ZapLevel = zapcore.FatalLevel
default:
fmt.Println("Unrecognized log level specified... defaulting to info.")
ZapLevel = zapcore.InfoLevel
}
// Default log level for debug mode is "debug"
envAppEnv := os.Getenv("APP_ENV")
if envAppEnv == "debug" {
fmt.Println("Debug app environment detected... forcing log level to debug.")
ZapLevel = zapcore.DebugLevel
}
AppZapCore = zapcore.NewTee(
zapcore.NewCore(AppZapFileEncoder, AppZapWriter, ZapLevel),
zapcore.NewCore(AppZapConsoleEncoder, zapcore.AddSync(os.Stdout), ZapLevel),
)
Logger = zap.New(AppZapCore, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
SLogger = Logger.Sugar()
}
func ChangeLogLevel(level string) {
if ZapLevel.String() == level {
return
}
switch level {
case "debug":
ZapLevel = zapcore.DebugLevel
case "info":
ZapLevel = zapcore.InfoLevel
case "warn":
ZapLevel = zapcore.WarnLevel
case "error":
ZapLevel = zapcore.ErrorLevel
case "panic":
ZapLevel = zapcore.PanicLevel
case "fatal":
ZapLevel = zapcore.FatalLevel
default:
Logger.Warn("Unrecognized log level specified... defaulting to info.")
ZapLevel = zapcore.InfoLevel
}
SLogger.Infof("Changing log level to %v", ZapLevel.String())
AppZapCore = zapcore.NewTee(
zapcore.NewCore(AppZapFileEncoder, AppZapWriter, ZapLevel),
zapcore.NewCore(AppZapConsoleEncoder, zapcore.AddSync(os.Stdout), ZapLevel),
)
Logger = zap.New(AppZapCore, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
SLogger = Logger.Sugar()
}