refactor(logger): add individual log module
This commit is contained in:
+5
-5
@@ -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 {
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
Reference in New Issue
Block a user