diff --git a/logging/logging.go b/logging/logging.go new file mode 100644 index 0000000..a685be5 --- /dev/null +++ b/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "io" + "log" + "os" +) + +func SetupLogging() { + logFile, err := os.OpenFile("data/server.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + multiWriter := io.MultiWriter(os.Stdout, logFile) + log.SetOutput(multiWriter) + log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) +} diff --git a/main.go b/main.go index 8e94d5e..6c2fc03 100644 --- a/main.go +++ b/main.go @@ -3,16 +3,16 @@ package main import ( "encoding/json" "fmt" - "io" "log" "math/rand" - "net" "net/http" "net/url" "os" "os/signal" "path/filepath" + "random-api-go/logging" "random-api-go/stats" + "random-api-go/utils" "strings" "sync" "syscall" @@ -95,8 +95,8 @@ func main() { source := rand.NewSource(time.Now().UnixNano()) rng = rand.New(source) - setupLogging() - statsManager = stats.NewStatsManager("stats.json") + logging.SetupLogging() + statsManager = stats.NewStatsManager("data/stats.json") // 设置优雅关闭 c := make(chan os.Signal, 1) @@ -132,37 +132,6 @@ func main() { } } -func setupLogging() { - logFile, err := os.OpenFile("server.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - log.Fatal(err) - } - multiWriter := io.MultiWriter(os.Stdout, logFile) - log.SetOutput(multiWriter) - log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) -} - -func getRealIP(r *http.Request) string { - ip := r.Header.Get("X-Real-IP") - if ip != "" { - return ip - } - - ip = r.Header.Get("X-Forwarded-For") - if ip != "" { - ips := strings.Split(ip, ",") - if len(ips) > 0 { - return strings.TrimSpace(ips[0]) - } - } - - ip, _, err := net.SplitHostPort(r.RemoteAddr) - if err != nil { - return r.RemoteAddr - } - return ip -} - func loadCSVPaths() error { jsonPath := filepath.Join("public", "url.json") log.Printf("Attempting to read file: %s", jsonPath) @@ -224,7 +193,7 @@ func getCSVContent(path string) (*URLSelector, error) { func handleAPIRequest(w http.ResponseWriter, r *http.Request) { start := time.Now() - realIP := getRealIP(r) + realIP := utils.GetRealIP(r) referer := r.Referer() // 获取来源域名 diff --git a/readme.md b/readme.md index 4cdd1cb..4570582 100644 --- a/readme.md +++ b/readme.md @@ -99,7 +99,7 @@ location ^~ / { ## 日志 -日志文件位于 `logs/server.log`。使用 Docker Compose 时,可以通过卷挂载访问日志。 +日志文件位于 `/root/data/server.log`。使用 Docker Compose 时,可以通过卷挂载访问日志。 ## 贡献 diff --git a/utils/utils.go b/utils/utils.go new file mode 100644 index 0000000..920adda --- /dev/null +++ b/utils/utils.go @@ -0,0 +1,28 @@ +package utils + +import ( + "net" + "net/http" + "strings" +) + +func GetRealIP(r *http.Request) string { + ip := r.Header.Get("X-Real-IP") + if ip != "" { + return ip + } + + ip = r.Header.Get("X-Forwarded-For") + if ip != "" { + ips := strings.Split(ip, ",") + if len(ips) > 0 { + return strings.TrimSpace(ips[0]) + } + } + + ip, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return r.RemoteAddr + } + return ip +}