refactor(logger): add individual log module
This commit is contained in:
10
handlers.go
10
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 {
|
||||
|
||||
38
main.go
38
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")
|
||||
}
|
||||
|
||||
|
||||
94
modules/postLog.go
Normal file
94
modules/postLog.go
Normal 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
super-frpc-linux
BIN
super-frpc-linux
Binary file not shown.
Reference in New Issue
Block a user