fix: logger race

- Refactor logger using sync.Once to improve performance
- Initiate log setup in a goroutine to prevent blocking
- Integrate gin.DefaultErrorWriter and gin.DefaultWriter for logging
- Introduce request ID generation for better request tracking
- Simplify setup logic by removing redundant variables and code
This commit is contained in:
Laisky.Cai 2024-04-20 06:17:26 +00:00
parent 2369025842
commit 4bf7522075
2 changed files with 17 additions and 29 deletions

View File

@ -16,7 +16,7 @@ import (
) )
// Regex to match data URL pattern // Regex to match data URL pattern
var dataURLPattern = regexp.MustCompile(`data:image/([^;]+);base64,(.*)`) var dataURLPattern = regexp.MustCompile(`data:image/([^;]+);base64,(.*)`)
func IsImageUrl(url string) (bool, error) { func IsImageUrl(url string) (bool, error) {
resp, err := http.Head(url) resp, err := http.Head(url)

View File

@ -3,15 +3,16 @@ package logger
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
"io" "io"
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
"sync" "sync"
"time" "time"
"github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
) )
const ( const (
@ -21,28 +22,20 @@ const (
loggerError = "ERR" loggerError = "ERR"
) )
var setupLogLock sync.Mutex var setupLogOnce sync.Once
var setupLogWorking bool
func SetupLogger() { func SetupLogger() {
if LogDir != "" { setupLogOnce.Do(func() {
ok := setupLogLock.TryLock() if LogDir != "" {
if !ok { logPath := filepath.Join(LogDir, fmt.Sprintf("oneapi-%s.log", time.Now().Format("20060102")))
log.Println("setup log is already working") fd, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
return if err != nil {
log.Fatal("failed to open log file")
}
gin.DefaultWriter = io.MultiWriter(os.Stdout, fd)
gin.DefaultErrorWriter = io.MultiWriter(os.Stderr, fd)
} }
defer func() { })
setupLogLock.Unlock()
setupLogWorking = false
}()
logPath := filepath.Join(LogDir, fmt.Sprintf("oneapi-%s.log", time.Now().Format("20060102")))
fd, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal("failed to open log file")
}
gin.DefaultWriter = io.MultiWriter(os.Stdout, fd)
gin.DefaultErrorWriter = io.MultiWriter(os.Stderr, fd)
}
} }
func SysLog(s string) { func SysLog(s string) {
@ -100,12 +93,7 @@ func logHelper(ctx context.Context, level string, msg string) {
} }
now := time.Now() now := time.Now()
_, _ = fmt.Fprintf(writer, "[%s] %v | %s | %s \n", level, now.Format("2006/01/02 - 15:04:05"), id, msg) _, _ = fmt.Fprintf(writer, "[%s] %v | %s | %s \n", level, now.Format("2006/01/02 - 15:04:05"), id, msg)
if !setupLogWorking { SetupLogger()
setupLogWorking = true
go func() {
SetupLogger()
}()
}
} }
func FatalLog(v ...any) { func FatalLog(v ...any) {