mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 07:43:41 +08:00 
			
		
		
		
	fix: logger race (#1339)
- 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:
		@@ -16,7 +16,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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) {
 | 
			
		||||
	resp, err := http.Head(url)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,15 +3,16 @@ package logger
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"github.com/songquanpeng/one-api/common/config"
 | 
			
		||||
	"github.com/songquanpeng/one-api/common/helper"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"github.com/songquanpeng/one-api/common/config"
 | 
			
		||||
	"github.com/songquanpeng/one-api/common/helper"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@@ -21,28 +22,20 @@ const (
 | 
			
		||||
	loggerError = "ERR"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var setupLogLock sync.Mutex
 | 
			
		||||
var setupLogWorking bool
 | 
			
		||||
var setupLogOnce sync.Once
 | 
			
		||||
 | 
			
		||||
func SetupLogger() {
 | 
			
		||||
	if LogDir != "" {
 | 
			
		||||
		ok := setupLogLock.TryLock()
 | 
			
		||||
		if !ok {
 | 
			
		||||
			log.Println("setup log is already working")
 | 
			
		||||
			return
 | 
			
		||||
	setupLogOnce.Do(func() {
 | 
			
		||||
		if LogDir != "" {
 | 
			
		||||
			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)
 | 
			
		||||
		}
 | 
			
		||||
		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) {
 | 
			
		||||
@@ -100,12 +93,7 @@ func logHelper(ctx context.Context, level string, msg string) {
 | 
			
		||||
	}
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	_, _ = fmt.Fprintf(writer, "[%s] %v | %s | %s \n", level, now.Format("2006/01/02 - 15:04:05"), id, msg)
 | 
			
		||||
	if !setupLogWorking {
 | 
			
		||||
		setupLogWorking = true
 | 
			
		||||
		go func() {
 | 
			
		||||
			SetupLogger()
 | 
			
		||||
		}()
 | 
			
		||||
	}
 | 
			
		||||
	SetupLogger()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FatalLog(v ...any) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user