worklog/internal/log/log.go
2023-01-27 17:11:22 +01:00

97 lines
2.1 KiB
Go

package log
import (
"fmt"
"os"
"strings"
"velvettear/worklog/internal/tools"
)
const LEVEL_DEBUG = 0
const LEVEL_INFO = 1
const LEVEL_WARNING = 2
const LEVEL_ERROR = 3
const LEVEL_FATAL = 4
var logLevel = 1
// exported functions
func SetLogLevel(level int) {
logLevel = level
}
func Debug(message string, extras ...string) {
DebugTimed(message, -1, extras...)
}
func DebugTimed(message string, timestamp int64, extras ...string) {
trace(LEVEL_DEBUG, timestamp, message, extras...)
}
func Info(message string, extras ...string) {
InfoTimed(message, -1, extras...)
}
func InfoTimed(message string, timestamp int64, extras ...string) {
trace(LEVEL_INFO, timestamp, message, extras...)
}
func Warning(message string, extras ...string) {
WarningTimed(message, -1, extras...)
}
func WarningTimed(message string, timestamp int64, extras ...string) {
trace(LEVEL_WARNING, timestamp, message, extras...)
}
func Error(message string, extras ...string) {
ErrorTimed(message, -1, extras...)
}
func ErrorTimed(message string, timestamp int64, extras ...string) {
trace(LEVEL_ERROR, -1, message, extras...)
}
func Fatal(message string, extras ...string) {
FatalTimed(message, -1, extras...)
}
func FatalTimed(message string, timestamp int64, extras ...string) {
trace(LEVEL_FATAL, timestamp, message, extras...)
trace(LEVEL_FATAL, -1, "exiting...")
os.Exit(1)
}
// unexported functions
func trace(level int, timestamp int64, message string, extras ...string) {
if len(message) == 0 || level < logLevel {
return
}
suffix := strings.Join(extras, " | ")
if len(suffix) > 0 {
message += " (" + suffix + ")"
}
if timestamp >= 0 {
message += " [" + tools.LogDifferenceMilliseconds(timestamp) + "]"
}
fmt.Println(buildLogMessage(getPrefixForLogLevel(level), message))
}
func getPrefixForLogLevel(level int) string {
switch level {
case LEVEL_FATAL:
return "fatal"
case LEVEL_ERROR:
return "error"
case LEVEL_WARNING:
return "warning"
case LEVEL_INFO:
return "info"
default:
return "debug"
}
}
func buildLogMessage(prefix string, message string) string {
return tools.GetFormattedDate() + " [" + prefix + "] > " + message
}