refactor(logger): add individual log module

This commit is contained in:
2026-02-26 11:56:35 +08:00
parent 3d6f657242
commit 3c2a2fd826
4 changed files with 119 additions and 23 deletions
+5 -5
View File
@@ -5,9 +5,9 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"log"
"net/http" "net/http"
"strconv" "strconv"
"super-frpc/modules"
"time" "time"
) )
@@ -173,7 +173,7 @@ func SendErrorResponse(w http.ResponseWriter, statusCode int, message string) {
} }
jsonResp, err := json.Marshal(resp) jsonResp, err := json.Marshal(resp)
if err != nil { if err != nil {
log.Printf("failed to marshal error response: %v", err) postLog.Error(fmt.Sprintf("failed to marshal error response: %v", err))
return return
} }
w.Write(jsonResp) w.Write(jsonResp)
@@ -189,7 +189,7 @@ func SendSuccessResponse(w http.ResponseWriter, message string, data interface{}
} }
jsonResp, err := json.Marshal(resp) jsonResp, err := json.Marshal(resp)
if err != nil { if err != nil {
log.Printf("failed to marshal success response: %v", err) postLog.Error(fmt.Sprintf("failed to marshal success response: %v", err))
return return
} }
w.Write(jsonResp) w.Write(jsonResp)
@@ -276,13 +276,13 @@ func GetClientIP(r *http.Request) string {
} }
func LogRequest(r *http.Request, userID int) { func LogRequest(r *http.Request, userID int) {
log.Printf("[%s] %s %s - UserID: %d - IP: %s", postLog.Info(fmt.Sprintf("[%s] %s %s - UserID: %d - IP: %s",
time.Now().Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05"),
r.Method, r.Method,
r.URL.Path, r.URL.Path,
userID, userID,
GetClientIP(r), GetClientIP(r),
) ))
} }
func IntToString(i int) string { func IntToString(i int) string {
+20 -18
View File
@@ -3,10 +3,10 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"log"
"net/http" "net/http"
"os" "os"
"os/signal" "os/signal"
"super-frpc/modules"
"syscall" "syscall"
"time" "time"
) )
@@ -23,28 +23,31 @@ func main() {
"configDir": "./configs" "configDir": "./configs"
}` }`
if err := os.WriteFile(*configPath, []byte(defaultConfig), 0644); err != nil { if err := os.WriteFile(*configPath, []byte(defaultConfig), 0644); err != nil {
log.Fatalf("failed to create default config file: %v", err) postLog.Fatal(fmt.Sprintf("failed to create default config file: %v", err))
} }
log.Printf("created default config file at %s", *configPath) postLog.Info(fmt.Sprintf("created default config file at %s", *configPath))
} }
_, err := LoadConfig(*configPath) config, err := LoadConfig(*configPath)
if err != nil { if err != nil {
log.Fatalf("failed to load config: %v", err) postLog.Fatal(fmt.Sprintf("failed to load config: %v", err))
} }
// Initialize logger with debug mode
postLog.SetDebugMode(config.Debug)
if err := InitDatabase(*dbPath); err != nil { if err := InitDatabase(*dbPath); err != nil {
log.Fatalf("failed to initialize database: %v", err) postLog.Fatal(fmt.Sprintf("failed to initialize database: %v", err))
} }
log.Println("database initialized successfully") postLog.Info("database initialized successfully")
if err := InitFrpcDatabase(*dbPath); err != nil { if err := InitFrpcDatabase(*dbPath); err != nil {
log.Printf("warning: failed to initialize frpc database: %v", err) postLog.Warning(fmt.Sprintf("failed to initialize frpc database: %v", err))
} }
config, err := GetConfig() _, err = GetConfig()
if err != nil { if err != nil {
log.Fatalf("failed to get config: %v", err) postLog.Fatal(fmt.Sprintf("failed to get config: %v", err))
} }
setupRoutes() setupRoutes()
@@ -58,9 +61,9 @@ func main() {
} }
go func() { go func() {
log.Printf("server starting on %s", addr) postLog.Info(fmt.Sprintf("server starting on %s", addr))
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("failed to start server: %v", err) postLog.Fatal(fmt.Sprintf("failed to start server: %v", err))
} }
}() }()
@@ -68,20 +71,19 @@ func main() {
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit <-quit
log.Println("shutting down server...") postLog.Info("shutting down server...")
if err := server.Close(); err != nil { if err := server.Close(); err != nil {
log.Printf("server closed with error: %v", err) postLog.Error(fmt.Sprintf("server closed with error: %v", err))
} }
if err := CloseDatabase(); err != nil { if err := CloseDatabase(); err != nil {
log.Printf("error closing database: %v", err) postLog.Error(fmt.Sprintf("error closing database: %v", err))
} }
if err := CloseFrpcDatabase(); err != nil { if err := CloseFrpcDatabase(); err != nil {
log.Printf("error closing frpc database: %v", err) postLog.Error(fmt.Sprintf("error closing frpc database: %v", err))
} }
log.Println("server stopped") postLog.Info("server stopped")
} }
+94
View File
@@ -0,0 +1,94 @@
package postLog
import (
"fmt"
"sync"
"time"
)
var (
loggerMutex sync.Mutex
debugMode bool
)
const (
DEBUG = iota
INFO
WARNING
ERROR
FATAL
)
var levelNames = []string{"DEBUG", "INFO", "WARNING", "ERROR", "FATAL"}
var levelColors = []int{34, 27, 220, 196, 124}
func colorOut_256(s string, foreColor int) string {
return fmt.Sprintf("\033[38;5;%dm%s\033[m", foreColor, s)
}
func getSystemTime() string {
now := time.Now()
return now.Format("2006-01-02 15:04:05.000")
}
// SetDebugMode sets the debug mode for the logger
func SetDebugMode(debug bool) {
loggerMutex.Lock()
defer loggerMutex.Unlock()
debugMode = debug
}
func PostLog(message string, level int) {
timeNow := getSystemTime()
idx := level
if idx < 0 || idx >= len(levelNames) {
idx = INFO // default to INFO
}
// Lock to make reading debug flag and all output atomic across threads
loggerMutex.Lock()
defer loggerMutex.Unlock()
// Skip DEBUG when debug is off
if idx == DEBUG && !debugMode {
return
}
// Colored output
levelDisplay := colorOut_256(levelNames[idx], levelColors[idx])
switch idx {
case DEBUG:
fmt.Printf("[%s - %s] %s\n", timeNow, levelDisplay, message)
case INFO:
fmt.Printf("[%s - %s] %s\n", timeNow, levelDisplay, message)
case WARNING:
fmt.Printf("[%s - %s] %s\n", timeNow, levelDisplay, message)
case ERROR:
fmt.Printf("[%s - %s] %s\n", timeNow, levelDisplay, message)
case FATAL:
fmt.Printf("[%s - %s] %s\n", timeNow, levelDisplay, message)
}
}
// Helper functions for different log levels
func Debug(message string) {
PostLog(message, DEBUG)
}
func Info(message string) {
PostLog(message, INFO)
}
func Warning(message string) {
PostLog(message, WARNING)
}
func Error(message string) {
PostLog(message, ERROR)
}
func Fatal(message string) {
PostLog(message, FATAL)
}
BIN
View File
Binary file not shown.