refactor(logger): add individual log module

This commit is contained in:
2026-02-26 11:56:35 +08:00
parent d76e28a358
commit 4e472e0145
4 changed files with 119 additions and 23 deletions

View File

@@ -5,9 +5,9 @@ import (
"errors"
"fmt"
"io"
"log"
"net/http"
"strconv"
"super-frpc/modules"
"time"
)
@@ -173,7 +173,7 @@ func SendErrorResponse(w http.ResponseWriter, statusCode int, message string) {
}
jsonResp, err := json.Marshal(resp)
if err != nil {
log.Printf("failed to marshal error response: %v", err)
postLog.Error(fmt.Sprintf("failed to marshal error response: %v", err))
return
}
w.Write(jsonResp)
@@ -189,7 +189,7 @@ func SendSuccessResponse(w http.ResponseWriter, message string, data interface{}
}
jsonResp, err := json.Marshal(resp)
if err != nil {
log.Printf("failed to marshal success response: %v", err)
postLog.Error(fmt.Sprintf("failed to marshal success response: %v", err))
return
}
w.Write(jsonResp)
@@ -276,13 +276,13 @@ func GetClientIP(r *http.Request) string {
}
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"),
r.Method,
r.URL.Path,
userID,
GetClientIP(r),
)
))
}
func IntToString(i int) string {

38
main.go
View File

@@ -3,10 +3,10 @@ package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"super-frpc/modules"
"syscall"
"time"
)
@@ -23,28 +23,31 @@ func main() {
"configDir": "./configs"
}`
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 {
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 {
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 {
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 {
log.Fatalf("failed to get config: %v", err)
postLog.Fatal(fmt.Sprintf("failed to get config: %v", err))
}
setupRoutes()
@@ -58,9 +61,9 @@ func main() {
}
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 {
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)
<-quit
log.Println("shutting down server...")
postLog.Info("shutting down server...")
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 {
log.Printf("error closing database: %v", err)
postLog.Error(fmt.Sprintf("error closing database: %v", err))
}
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
modules/postLog.go Normal file
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)
}

Binary file not shown.