diff --git a/handlers.go b/handlers.go index 72c1853..ea10ddd 100644 --- a/handlers.go +++ b/handlers.go @@ -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 { diff --git a/main.go b/main.go index 9144516..6c19271 100644 --- a/main.go +++ b/main.go @@ -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") } - diff --git a/modules/postLog.go b/modules/postLog.go new file mode 100644 index 0000000..ebfdfda --- /dev/null +++ b/modules/postLog.go @@ -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) +} diff --git a/super-frpc-linux b/super-frpc-linux deleted file mode 100644 index 25180ee..0000000 Binary files a/super-frpc-linux and /dev/null differ