2025-01-21 14:02:43 +00:00
|
|
|
package logger
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"slices"
|
2025-01-26 00:31:40 +00:00
|
|
|
"time"
|
2025-01-21 14:02:43 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type LogLevel int
|
|
|
|
|
|
|
|
const (
|
|
|
|
DISABLED LogLevel = 0
|
|
|
|
ERROR LogLevel = 1
|
|
|
|
FATAL LogLevel = 1
|
|
|
|
WARNING LogLevel = 2
|
|
|
|
INFO LogLevel = 3
|
|
|
|
DEBUG LogLevel = 4
|
|
|
|
API LogLevel = 10
|
|
|
|
// COLORS
|
|
|
|
RED = "\033[31m"
|
|
|
|
GREEN = "\033[32m"
|
|
|
|
YELLOW = "\033[33m"
|
|
|
|
GRAY = "\033[37m"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
loggers []*Logger
|
|
|
|
)
|
|
|
|
|
|
|
|
type levelConsts struct {
|
|
|
|
INFO string
|
|
|
|
FATAL string
|
|
|
|
ERROR string
|
|
|
|
WARNING string
|
|
|
|
DEBUG string
|
|
|
|
API string
|
|
|
|
DISABLED string
|
|
|
|
}
|
|
|
|
|
|
|
|
var levels = levelConsts{
|
2025-01-26 00:31:40 +00:00
|
|
|
INFO: "INFO ", // with consistent space padding
|
2025-01-21 14:02:43 +00:00
|
|
|
FATAL: "FATAL",
|
|
|
|
ERROR: "ERROR",
|
|
|
|
WARNING: "WARN ", // with consistent space padding
|
|
|
|
DEBUG: "DEBUG",
|
|
|
|
DISABLED: "DISABLED",
|
|
|
|
API: "API",
|
|
|
|
}
|
|
|
|
|
|
|
|
// stringToLevel maps string representation to LogLevel
|
|
|
|
var stringToLevel = map[string]LogLevel{
|
|
|
|
"DEBUG": DEBUG,
|
2025-01-26 00:31:40 +00:00
|
|
|
"INFO ": INFO, // with consistent space padding
|
2025-01-21 14:02:43 +00:00
|
|
|
"ERROR": ERROR,
|
|
|
|
"DISABLED": DISABLED,
|
|
|
|
"WARN ": WARNING, // with consistent space padding
|
|
|
|
"FATAL": FATAL,
|
|
|
|
"API": API,
|
|
|
|
}
|
|
|
|
|
|
|
|
// Log prints a log message if its level is greater than or equal to the logger's levels
|
|
|
|
func Log(level string, msg string, prefix, api bool, color string) {
|
|
|
|
LEVEL := stringToLevel[level]
|
|
|
|
for _, logger := range loggers {
|
|
|
|
if api {
|
|
|
|
if logger.disabledAPI || !slices.Contains(logger.apiLevels, LEVEL) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if logger.disabled || !slices.Contains(logger.levels, LEVEL) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
2025-01-26 00:31:40 +00:00
|
|
|
if logger.stdout && level == "FATAL" {
|
2025-01-21 14:02:43 +00:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
writeOut := msg
|
2025-01-26 00:31:40 +00:00
|
|
|
formattedTime := time.Now().Format("2006/01/02 15:04:05")
|
|
|
|
if logger.colors && color != "" {
|
|
|
|
formattedTime = formattedTime + color
|
|
|
|
}
|
|
|
|
if prefix || logger.debugEnabled {
|
|
|
|
logger.logger.SetPrefix(fmt.Sprintf("%s [%s] ", formattedTime, level))
|
|
|
|
} else {
|
|
|
|
logger.logger.SetPrefix(formattedTime + " ")
|
2025-01-21 14:02:43 +00:00
|
|
|
}
|
|
|
|
if logger.colors && color != "" {
|
2025-01-26 00:31:40 +00:00
|
|
|
writeOut = writeOut + "\033[0m"
|
2025-01-21 14:02:43 +00:00
|
|
|
}
|
|
|
|
err := logger.logger.Output(3, writeOut) // 3 skips this function for correct file:line
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("failed to log message '%v' with error `%v`", msg, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Api(msg string, statusCode int) {
|
|
|
|
if statusCode >= 300 && statusCode < 500 {
|
|
|
|
Log(levels.WARNING, msg, false, true, YELLOW)
|
|
|
|
} else if statusCode >= 500 {
|
|
|
|
Log(levels.ERROR, msg, false, true, RED)
|
|
|
|
} else {
|
|
|
|
Log(levels.INFO, msg, false, true, GREEN)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Helper methods for specific log levels
|
|
|
|
func Debug(msg string) {
|
|
|
|
if len(loggers) > 0 {
|
|
|
|
Log(levels.DEBUG, msg, true, false, GRAY)
|
2025-01-26 00:31:40 +00:00
|
|
|
} else {
|
2025-02-01 13:10:46 +00:00
|
|
|
log.Println("[DEBUG] ", msg)
|
2025-01-21 14:02:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Info(msg string) {
|
|
|
|
if len(loggers) > 0 {
|
|
|
|
Log(levels.INFO, msg, false, false, "")
|
|
|
|
} else {
|
|
|
|
log.Println(msg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Warning(msg string) {
|
|
|
|
if len(loggers) > 0 {
|
|
|
|
Log(levels.WARNING, msg, true, false, YELLOW)
|
|
|
|
} else {
|
2025-02-01 13:10:46 +00:00
|
|
|
log.Println("[WARN ] ", msg)
|
2025-01-21 14:02:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Error(msg string) {
|
|
|
|
if len(loggers) > 0 {
|
|
|
|
Log(levels.ERROR, msg, true, false, RED)
|
|
|
|
} else {
|
2025-02-01 13:10:46 +00:00
|
|
|
log.Println("[ERROR] ", msg)
|
2025-01-21 14:02:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Fatal(msg string) {
|
|
|
|
if len(loggers) > 0 {
|
|
|
|
Log(levels.FATAL, msg, true, false, RED)
|
|
|
|
}
|
2025-02-01 13:10:46 +00:00
|
|
|
log.Fatal("[FATAL] ", msg)
|
2025-01-21 14:02:43 +00:00
|
|
|
}
|