real init
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
infoLogger *log.Logger
|
||||
warnLogger *log.Logger
|
||||
errorLogger *log.Logger
|
||||
debugLogger *log.Logger
|
||||
|
||||
once sync.Once
|
||||
)
|
||||
|
||||
func initLogger() {
|
||||
if err := os.MkdirAll("logs", 0755); err != nil {
|
||||
log.Printf("Failed to create logs directory: %v. Falling back to standard output.", err)
|
||||
}
|
||||
|
||||
// 1. Setup Info Logger
|
||||
var infoOutput io.Writer = os.Stdout
|
||||
if infoFile, err := os.OpenFile("logs/info.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err == nil {
|
||||
infoOutput = io.MultiWriter(os.Stdout, infoFile)
|
||||
writeHeader(infoFile)
|
||||
}
|
||||
infoLogger = log.New(infoOutput, "INFO: ", log.Ldate|log.Ltime|log.LUTC)
|
||||
|
||||
// 2. Setup Warn Logger
|
||||
var warnOutput io.Writer = os.Stdout
|
||||
if warnFile, err := os.OpenFile("logs/warn.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err == nil {
|
||||
warnOutput = io.MultiWriter(os.Stdout, warnFile)
|
||||
writeHeader(warnFile)
|
||||
}
|
||||
warnLogger = log.New(warnOutput, "WARN: ", log.Ldate|log.Ltime|log.LUTC)
|
||||
|
||||
// 3. Setup Error Logger
|
||||
var errorOutput io.Writer = os.Stderr
|
||||
if errorFile, err := os.OpenFile("logs/error.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err == nil {
|
||||
errorOutput = io.MultiWriter(os.Stderr, errorFile)
|
||||
writeHeader(errorFile)
|
||||
}
|
||||
// Note: increased call depth isn't an issue for Lshortfile here because
|
||||
// log.Logger.Printf correctly tracks the caller frame right above it.
|
||||
errorLogger = log.New(errorOutput, "ERROR: ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)
|
||||
|
||||
// 4. Setup Debug Logger
|
||||
var debugOutput io.Writer = os.Stdout
|
||||
if debugFile, err := os.OpenFile("logs/debug.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err == nil {
|
||||
debugOutput = io.MultiWriter(os.Stdout, debugFile)
|
||||
writeHeader(debugFile)
|
||||
}
|
||||
debugLogger = log.New(debugOutput, "DEBUG: ", log.Ldate|log.Ltime|log.LUTC)
|
||||
}
|
||||
|
||||
func writeHeader(file *os.File) {
|
||||
file.WriteString("========== Start Log ==========\n")
|
||||
file.WriteString("[INFO] Logger initialized\n")
|
||||
file.WriteString("[" + time.Now().Format(time.RFC3339) + "]\n")
|
||||
}
|
||||
|
||||
// Info accepts a format string and an optional, arbitrary number of arguments.
|
||||
func Info(format string, v ...any) {
|
||||
once.Do(initLogger)
|
||||
infoLogger.Printf(format, v...)
|
||||
}
|
||||
|
||||
// Warn accepts a format string and an optional, arbitrary number of arguments.
|
||||
func Warn(format string, v ...any) {
|
||||
once.Do(initLogger)
|
||||
warnLogger.Printf(format, v...)
|
||||
}
|
||||
|
||||
// Error accepts a format string and an optional, arbitrary number of arguments.
|
||||
func Error(format string, v ...any) {
|
||||
once.Do(initLogger)
|
||||
errorLogger.Printf(format, v...)
|
||||
}
|
||||
|
||||
// Debug accepts a format string and an optional, arbitrary number of arguments.
|
||||
func Debug(format string, v ...any) {
|
||||
once.Do(initLogger)
|
||||
debugLogger.Printf(format, v...)
|
||||
}
|
||||
Reference in New Issue
Block a user