// Copyright (c) 2026 S.A. (SNOWARE). Written for SCU Team. // Licensed under MulanPubL-2.0. // You may obtain a copy at: http://license.coscl.org.cn/MulanPubL-2.0 // THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND. // logger 模块:基于 zerolog 的日志初始化,支持控制台输出(可读格式)+ 文件输出(JSON 结构化)。 package main import ( "fmt" "io" "os" "path/filepath" "time" "github.com/rs/zerolog" ) // log 包级全局日志实例,所有 .go 文件共用。 var log zerolog.Logger // initLogger 初始化全局日志: // - 日志文件存储在 srcc.exe 同目录的 log/ 下,按日期命名 // - 控制台使用可读的 ConsoleWriter(带颜色) // - 同时输出到控制台和文件 func initLogger() { exePath, err := os.Executable() if err != nil { exePath, _ = os.Getwd() } exeDir := filepath.Dir(exePath) logDir := filepath.Join(exeDir, "log") if err := os.MkdirAll(logDir, 0755); err != nil { panic(fmt.Sprintf("无法创建日志目录: %v", err)) } today := time.Now().Format("2006-01-02") logFile := filepath.Join(logDir, today+".log") file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { panic(fmt.Sprintf("无法打开日志文件: %v", err)) } consoleWriter := zerolog.ConsoleWriter{ Out: os.Stdout, TimeFormat: "2006-01-02 15:04:05", NoColor: false, } multi := io.MultiWriter(consoleWriter, file) log = zerolog.New(multi). With(). Timestamp(). Caller(). Logger(). Level(zerolog.DebugLevel) }