add JRZQ09J8、FLXGDEA8、FLXGDEA9、JRZQ1D09

add external_services log
This commit is contained in:
2025-08-25 15:44:06 +08:00
parent 365a2a8886
commit 267ff92998
80 changed files with 5555 additions and 1254 deletions

View File

@@ -0,0 +1,264 @@
# 通用外部服务日志系统
## 概述
这是一个为外部服务(如 westdex、zhicha、yushan 等)提供统一日志记录功能的通用系统。所有外部服务共享相同的日志基础架构,但保持各自独立的日志文件目录。
## 设计目标
1. **代码复用**: 避免重复的日志实现代码
2. **统一格式**: 所有外部服务使用相同的日志格式
3. **独立存储**: 每个服务的日志存储在独立目录中
4. **灵活配置**: 支持每个服务独立的日志配置
5. **易于扩展**: 新增外部服务时只需简单配置
## 架构特点
### 1. 共享核心
- 统一的日志接口
- 相同的日志格式
- 一致的配置结构
- 共用的文件轮转策略
### 2. 服务分离
- 每个服务有独立的日志目录
- 通过 `service` 字段区分来源
- 可独立配置每个服务的日志参数
- 支持按级别分离日志文件
### 3. 配置灵活
- 支持从配置文件读取
- 支持自定义配置创建
- 支持简单模式(无日志)
- 支持日志级别分离
## 已集成的服务
### 1. WestDex (西部数据)
- 服务名称: `westdex`
- 日志目录: `logs/external_services/westdex/`
- 主要功能: 企业信息查询
### 2. Zhicha (智查金控)
- 服务名称: `zhicha`
- 日志目录: `logs/external_services/zhicha/`
- 主要功能: 企业信息查询、AES加密
### 3. Yushan (羽山)
- 服务名称: `yushan`
- 日志目录: `logs/external_services/yushan/`
- 主要功能: 企业信息查询、AES加密
## 日志格式
所有服务的日志都包含以下标准字段:
```json
{
"level": "INFO",
"timestamp": "2024-01-01T12:00:00Z",
"msg": "服务名 API请求",
"service": "服务名",
"request_id": "服务名_唯一ID",
"api_code": "API代码",
"url": "请求URL",
"params": "请求参数",
"status_code": "响应状态码",
"response": "响应内容",
"duration": "请求耗时",
"error": "错误信息"
}
```
## 配置结构
```yaml
# 外部服务日志根目录
external_services_log_dir: "./logs/external_services"
# 各服务配置
westdex:
logging:
enabled: true
log_dir: "./logs/external_services"
service_name: "westdex"
use_daily: true # 启用按天分隔
enable_level_separation: true # 启用级别分离
level_configs:
info: { max_size: 100, max_backups: 3, max_age: 28, compress: true }
error: { max_size: 200, max_backups: 10, max_age: 90, compress: true }
warn: { max_size: 100, max_backups: 3, max_age: 28, compress: true }
zhicha:
logging:
enabled: true
log_dir: "./logs/external_services"
service_name: "zhicha"
use_daily: true # 启用按天分隔
enable_level_separation: true # 启用级别分离
level_configs:
info: { max_size: 100, max_backups: 3, max_age: 28, compress: true }
error: { max_size: 200, max_backups: 10, max_age: 90, compress: true }
warn: { max_size: 100, max_backups: 3, max_age: 28, compress: true }
yushan:
logging:
enabled: true
log_dir: "./logs/external_services"
service_name: "yushan"
use_daily: true # 启用按天分隔
enable_level_separation: true # 启用级别分离
level_configs:
info: { max_size: 100, max_backups: 3, max_age: 28, compress: true }
error: { max_size: 200, max_backups: 10, max_age: 90, compress: true }
warn: { max_size: 100, max_backups: 3, max_age: 28, compress: true }
```
## 使用方法
### 1. 从配置创建服务
```go
// 推荐方式:从配置文件创建
westdexService, err := westdex.NewWestDexServiceWithConfig(cfg)
zhichaService, err := zhicha.NewZhichaServiceWithConfig(cfg)
yushanService, err := yushan.NewYushanServiceWithConfig(cfg)
```
### 2. 自定义日志配置
```go
loggingConfig := external_logger.ExternalServiceLoggingConfig{
Enabled: true,
LogDir: "./logs/external_services",
ServiceName: "custom_service",
EnableLevelSeparation: true,
// ... 其他配置
}
service := NewCustomServiceWithLogging(url, key, secret, loggingConfig)
```
### 3. 简单模式(无日志)
```go
// 创建无日志的服务实例
service := NewServiceSimple(url, key, secret)
```
## 日志级别
### 1. INFO 级别
- API 请求日志
- API 响应日志
- 一般信息日志
### 2. WARN 级别
- 警告信息
- 非致命错误
### 3. ERROR 级别
- API 调用错误
- 系统异常
- 业务逻辑错误
## 文件轮转策略
### 1. 按大小+时间混合分隔
系统支持两种日志分隔策略:
#### 按天分隔(推荐)
- **UseDaily**: 设置为 `true` 时启用
- 每天创建新的日期目录:`logs/westdex/2024-01-01/`
- 在日期目录下按级别分隔:`westdex_info.log``westdex_error.log``westdex_warn.log`
- 自动清理过期的日期目录
#### 传统方式
- **UseDaily**: 设置为 `false` 时使用
- 直接在服务目录下按级别分隔:`logs/westdex/westdex_info.log`
### 2. 文件轮转配置
每个日志级别都支持以下轮转配置:
- **MaxSize**: 单个文件最大大小MB
- **MaxBackups**: 最大备份文件数
- **MaxAge**: 最大保留天数
- **Compress**: 是否压缩旧文件
### 3. 目录结构示例
```
logs/
├── westdex/
│ ├── 2024-01-01/
│ │ ├── westdex_info.log
│ │ ├── westdex_error.log
│ │ └── westdex_warn.log
│ ├── 2024-01-02/
│ │ ├── westdex_info.log
│ │ ├── westdex_error.log
│ │ └── westdex_warn.log
│ └── westdex_info.log (回退文件)
├── zhicha/
│ ├── 2024-01-01/
│ │ ├── zhicha_info.log
│ │ ├── zhicha_error.log
│ │ └── zhicha_warn.log
│ └── zhicha_info.log (回退文件)
└── yushan/
├── 2024-01-01/
│ ├── yushan_info.log
│ ├── yushan_error.log
│ └── yushan_warn.log
└── yushan_info.log (回退文件)
```
## 扩展新服务
要添加新的外部服务,只需:
1. 在服务中使用 `external_logger.ExternalServiceLogger`
2. 设置合适的 `ServiceName`
3. 使用统一的日志接口
4. 在配置文件中添加相应的日志配置
```go
// 新服务示例
func NewCustomService(config CustomConfig) *CustomService {
loggingConfig := external_logger.ExternalServiceLoggingConfig{
ServiceName: "custom_service",
LogDir: config.LogDir,
// ... 其他配置
}
logger, _ := external_logger.NewExternalServiceLogger(loggingConfig)
return &CustomService{
config: config,
logger: logger,
}
}
```
## 优势总结
1. **维护简便**: 只需维护一套日志代码
2. **格式统一**: 所有服务使用相同的日志格式
3. **配置灵活**: 支持每个服务独立的配置
4. **易于扩展**: 新增服务只需简单配置
5. **性能优化**: 共享的日志基础设施
6. **监控友好**: 统一的日志格式便于监控和分析
7. **智能分隔**: 支持按大小+时间混合分隔策略
8. **自动清理**: 自动清理过期的日志目录,节省磁盘空间
9. **故障回退**: 如果按天分隔失败,自动回退到传统方式
## 注意事项
1. 确保日志目录有足够的磁盘空间
2. 定期清理过期的日志文件
3. 监控日志文件大小,避免磁盘空间不足
4. 在生产环境中建议启用日志压缩
5. 根据业务需求调整日志保留策略
6. 启用按天分隔时,确保系统时间准确
7. 监控自动清理任务的执行情况
8. 建议在生产环境中设置合理的 `MaxAge` 值,避免日志文件过多

View File

@@ -0,0 +1,286 @@
# 通用外部服务日志系统使用示例
## 概述
这个通用的外部服务日志系统允许 westdex 和 zhicha 服务共享相同的日志基础架构,但保持各自独立的日志文件目录。
## 目录结构
使用共享日志系统后,日志目录结构如下:
```
logs/
├── external_services/ # 外部服务日志根目录
│ ├── westdex/ # westdex 服务日志
│ │ ├── westdex_info.log
│ │ ├── westdex_error.log
│ │ └── westdex_warn.log
│ ├── zhicha/ # zhicha 服务日志
│ │ ├── zhicha_info.log
│ │ ├── zhicha_error.log
│ │ └── zhicha_warn.log
│ └── yushan/ # yushan 服务日志
│ ├── yushan_info.log
│ ├── yushan_error.log
│ └── yushan_warn.log
```
## 配置示例
### 1. 在 config.yaml 中配置
```yaml
# 外部服务日志根目录
external_services_log_dir: "./logs/external_services"
# westdex 配置
westdex:
url: "https://api.westdex.com"
key: "your_key"
secret_id: "your_secret_id"
secret_second_id: "your_secret_second_id"
logging:
enabled: true
log_dir: "./logs/external_services" # 使用共享根目录
enable_level_separation: true
level_configs:
info:
max_size: 100
max_backups: 3
max_age: 28
compress: true
error:
max_size: 100
max_backups: 3
max_age: 28
compress: true
warn:
max_size: 100
max_backups: 3
max_age: 28
compress: true
# zhicha 配置
zhicha:
url: "https://www.zhichajinkong.com/dataMiddle/api/handle"
app_id: "your_app_id"
app_secret: "your_app_secret"
pro_id: "your_pro_id"
logging:
enabled: true
log_dir: "./logs/external_services" # 使用共享根目录
enable_level_separation: true
level_configs:
info:
max_size: 100
max_backups: 3
max_age: 28
compress: true
error:
max_size: 100
max_backups: 3
max_age: 28
compress: true
warn:
max_size: 100
max_backups: 3
max_age: 28
compress: true
# yushan 配置
yushan:
url: "https://api.yushan.com"
api_key: "your_api_key"
acct_id: "your_acct_id"
logging:
enabled: true
log_dir: "./logs/external_services" # 使用共享根目录
enable_level_separation: true
level_configs:
info:
max_size: 100
max_backups: 3
max_age: 28
compress: true
error:
max_size: 100
max_backups: 3
max_age: 28
compress: true
warn:
max_size: 100
max_backups: 3
max_age: 28
compress: true
```
## 使用方法
### 1. 创建 WestDex 服务
```go
import "tyapi-server/internal/infrastructure/external/westdex"
// 从配置创建(推荐)
westdexService, err := westdex.NewWestDexServiceWithConfig(cfg)
if err != nil {
log.Fatal(err)
}
// 使用自定义日志配置
loggingConfig := external_logger.ExternalServiceLoggingConfig{
Enabled: true,
LogDir: "./logs/external_services",
ServiceName: "westdex", // 会自动设置
EnableLevelSeparation: true,
// ... 其他配置
}
westdexService, err := westdex.NewWestDexServiceWithLogging(
"url", "key", "secretID", "secretSecondID",
loggingConfig,
)
```
### 2. 创建 Zhicha 服务
```go
import "tyapi-server/internal/infrastructure/external/zhicha"
// 从配置创建(推荐)
zhichaService, err := zhicha.NewZhichaServiceWithConfig(cfg)
if err != nil {
log.Fatal(err)
}
// 使用自定义日志配置
loggingConfig := external_logger.ExternalServiceLoggingConfig{
Enabled: true,
LogDir: "./logs/external_services",
ServiceName: "zhicha", // 会自动设置
EnableLevelSeparation: true,
// ... 其他配置
}
zhichaService, err := zhicha.NewZhichaServiceWithLogging(
"url", "appID", "appSecret", "proID",
loggingConfig,
)
```
### 3. 创建 Yushan 服务
```go
import "tyapi-server/internal/infrastructure/external/yushan"
// 从配置创建(推荐)
yushanService, err := yushan.NewYushanServiceWithConfig(cfg)
if err != nil {
log.Fatal(err)
}
// 使用自定义日志配置
loggingConfig := external_logger.ExternalServiceLoggingConfig{
Enabled: true,
LogDir: "./logs/external_services",
ServiceName: "yushan", // 会自动设置
EnableLevelSeparation: true,
// ... 其他配置
}
yushanService, err := yushan.NewYushanServiceWithLogging(
"url", "apiKey", "acctID",
loggingConfig,
)
```
## 日志内容示例
### WestDex 日志内容
```json
{
"level": "INFO",
"timestamp": "2024-01-01T12:00:00Z",
"msg": "westdex API请求",
"service": "westdex",
"request_id": "westdex_12345678",
"api_code": "G05HZ01",
"url": "https://api.westdex.com/G05HZ01",
"params": {...}
}
```
### Zhicha 日志内容
```json
{
"level": "INFO",
"timestamp": "2024-01-01T12:00:00Z",
"msg": "zhicha API请求",
"service": "zhicha",
"request_id": "zhicha_87654321",
"api_code": "handle",
"url": "https://www.zhichajinkong.com/dataMiddle/api/handle",
"params": {...}
}
```
### Yushan 日志内容
```json
{
"level": "INFO",
"timestamp": "2024-01-01T12:00:00Z",
"msg": "yushan API请求",
"service": "yushan",
"request_id": "yushan_12345678",
"api_code": "G05HZ01",
"url": "https://api.yushan.com",
"params": {...}
}
```
## 优势
### 1. 代码复用
- 相同的日志基础架构
- 统一的日志格式
- 相同的配置结构
### 2. 维护简便
- 只需维护一套日志代码
- 统一的日志级别管理
- 统一的文件轮转策略
### 3. 清晰分离
- 每个服务有独立的日志目录
- 通过 `service` 字段区分来源
- 可独立配置每个服务的日志参数
### 4. 扩展性
- 易于添加新的外部服务
- 统一的日志接口
- 灵活的配置选项
## 添加新的外部服务
要添加新的外部服务(如 TianYanCha只需
1. 在服务中使用 `external_logger.ExternalServiceLogger`
2. 设置合适的 `ServiceName`
3. 使用统一的日志接口
```go
// 新服务示例
func NewTianYanChaService(config TianYanChaConfig) *TianYanChaService {
loggingConfig := external_logger.ExternalServiceLoggingConfig{
ServiceName: "tianyancha",
LogDir: config.LogDir,
// ... 其他配置
}
logger, _ := external_logger.NewExternalServiceLogger(loggingConfig)
return &TianYanChaService{
config: config,
logger: logger,
}
}
```
这样新服务的日志会自动保存到 `logs/external_services/tianyancha/` 目录。

View File

@@ -0,0 +1,315 @@
package external_logger
import (
"fmt"
"os"
"path/filepath"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
// ExternalServiceLoggingConfig 外部服务日志配置
type ExternalServiceLoggingConfig struct {
Enabled bool `yaml:"enabled"`
LogDir string `yaml:"log_dir"`
ServiceName string `yaml:"service_name"` // 服务名称,用于区分日志目录
UseDaily bool `yaml:"use_daily"`
EnableLevelSeparation bool `yaml:"enable_level_separation"`
LevelConfigs map[string]ExternalServiceLevelFileConfig `yaml:"level_configs"`
}
// ExternalServiceLevelFileConfig 外部服务级别文件配置
type ExternalServiceLevelFileConfig struct {
MaxSize int `yaml:"max_size"`
MaxBackups int `yaml:"max_backups"`
MaxAge int `yaml:"max_age"`
Compress bool `yaml:"compress"`
}
// ExternalServiceLogger 外部服务日志器
type ExternalServiceLogger struct {
logger *zap.Logger
config ExternalServiceLoggingConfig
serviceName string
}
// NewExternalServiceLogger 创建外部服务日志器
func NewExternalServiceLogger(config ExternalServiceLoggingConfig) (*ExternalServiceLogger, error) {
if !config.Enabled {
return &ExternalServiceLogger{
logger: zap.NewNop(),
serviceName: config.ServiceName,
}, nil
}
// 根据服务名称创建独立的日志目录
serviceLogDir := filepath.Join(config.LogDir, config.ServiceName)
// 确保日志目录存在
if err := os.MkdirAll(serviceLogDir, 0755); err != nil {
return nil, fmt.Errorf("创建日志目录失败: %w", err)
}
// 创建基础配置
zapConfig := zap.NewProductionConfig()
zapConfig.OutputPaths = []string{"stdout"}
zapConfig.ErrorOutputPaths = []string{"stderr"}
// 创建基础logger
baseLogger, err := zapConfig.Build()
if err != nil {
return nil, fmt.Errorf("创建基础logger失败: %w", err)
}
// 如果启用级别分离,创建文件输出
if config.EnableLevelSeparation {
core := createSeparatedCore(serviceLogDir, config)
baseLogger = zap.New(core)
}
// 创建日志器实例
logger := &ExternalServiceLogger{
logger: baseLogger,
config: config,
serviceName: config.ServiceName,
}
// 如果启用按天分隔,启动定时清理任务
if config.UseDaily {
go logger.startCleanupTask()
}
return logger, nil
}
// createSeparatedCore 创建分离的日志核心
func createSeparatedCore(logDir string, config ExternalServiceLoggingConfig) zapcore.Core {
// 创建编码器
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "timestamp"
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
// 创建不同级别的文件输出
infoWriter := createFileWriter(logDir, "info", config.LevelConfigs["info"], config.ServiceName, config.UseDaily)
errorWriter := createFileWriter(logDir, "error", config.LevelConfigs["error"], config.ServiceName, config.UseDaily)
warnWriter := createFileWriter(logDir, "warn", config.LevelConfigs["warn"], config.ServiceName, config.UseDaily)
// 修复:创建真正的级别分离核心
// 使用自定义的LevelEnabler来确保每个Core只处理特定级别的日志
infoCore := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(infoWriter),
&levelEnabler{minLevel: zapcore.InfoLevel, maxLevel: zapcore.InfoLevel}, // 只接受INFO级别
)
errorCore := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(errorWriter),
&levelEnabler{minLevel: zapcore.ErrorLevel, maxLevel: zapcore.ErrorLevel}, // 只接受ERROR级别
)
warnCore := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(warnWriter),
&levelEnabler{minLevel: zapcore.WarnLevel, maxLevel: zapcore.WarnLevel}, // 只接受WARN级别
)
// 使用 zapcore.NewTee 合并核心,现在每个核心只会处理自己级别的日志
return zapcore.NewTee(infoCore, errorCore, warnCore)
}
// levelEnabler 自定义级别过滤器,确保只接受指定级别的日志
type levelEnabler struct {
minLevel zapcore.Level
maxLevel zapcore.Level
}
// Enabled 实现 zapcore.LevelEnabler 接口
func (l *levelEnabler) Enabled(level zapcore.Level) bool {
return level >= l.minLevel && level <= l.maxLevel
}
// createFileWriter 创建文件写入器
func createFileWriter(logDir, level string, config ExternalServiceLevelFileConfig, serviceName string, useDaily bool) *lumberjack.Logger {
// 使用默认配置如果未指定
if config.MaxSize == 0 {
config.MaxSize = 100
}
if config.MaxBackups == 0 {
config.MaxBackups = 3
}
if config.MaxAge == 0 {
config.MaxAge = 28
}
// 构建文件名
var filename string
if useDaily {
// 按天分隔logs/westdex/2024-01-01/westdex_info.log
date := time.Now().Format("2006-01-02")
dateDir := filepath.Join(logDir, date)
// 确保日期目录存在
if err := os.MkdirAll(dateDir, 0755); err != nil {
// 如果创建日期目录失败,回退到根目录
filename = filepath.Join(logDir, fmt.Sprintf("%s_%s.log", serviceName, level))
} else {
filename = filepath.Join(dateDir, fmt.Sprintf("%s_%s.log", serviceName, level))
}
} else {
// 传统方式logs/westdex/westdex_info.log
filename = filepath.Join(logDir, fmt.Sprintf("%s_%s.log", serviceName, level))
}
return &lumberjack.Logger{
Filename: filename,
MaxSize: config.MaxSize,
MaxBackups: config.MaxBackups,
MaxAge: config.MaxAge,
Compress: config.Compress,
}
}
// LogRequest 记录请求日志
func (e *ExternalServiceLogger) LogRequest(requestID, apiCode string, url interface{}, params interface{}) {
e.logger.Info(fmt.Sprintf("%s API请求", e.serviceName),
zap.String("service", e.serviceName),
zap.String("request_id", requestID),
zap.String("api_code", apiCode),
zap.Any("url", url),
zap.Any("params", params),
zap.String("timestamp", time.Now().Format(time.RFC3339)),
)
}
// LogResponse 记录响应日志
func (e *ExternalServiceLogger) LogResponse(requestID, apiCode string, statusCode int, response []byte, duration time.Duration) {
e.logger.Info(fmt.Sprintf("%s API响应", e.serviceName),
zap.String("service", e.serviceName),
zap.String("request_id", requestID),
zap.String("api_code", apiCode),
zap.Int("status_code", statusCode),
zap.String("response", string(response)),
zap.Duration("duration", duration),
zap.String("timestamp", time.Now().Format(time.RFC3339)),
)
}
// LogError 记录错误日志
func (e *ExternalServiceLogger) LogError(requestID, apiCode string, err error, params interface{}) {
e.logger.Error(fmt.Sprintf("%s API错误", e.serviceName),
zap.String("service", e.serviceName),
zap.String("request_id", requestID),
zap.String("api_code", apiCode),
zap.Error(err),
zap.Any("params", params),
zap.String("timestamp", time.Now().Format(time.RFC3339)),
)
}
// LogInfo 记录信息日志
func (e *ExternalServiceLogger) LogInfo(message string, fields ...zap.Field) {
allFields := []zap.Field{zap.String("service", e.serviceName)}
allFields = append(allFields, fields...)
e.logger.Info(message, allFields...)
}
// LogWarn 记录警告日志
func (e *ExternalServiceLogger) LogWarn(message string, fields ...zap.Field) {
allFields := []zap.Field{zap.String("service", e.serviceName)}
allFields = append(allFields, fields...)
e.logger.Warn(message, allFields...)
}
// LogErrorWithFields 记录带字段的错误日志
func (e *ExternalServiceLogger) LogErrorWithFields(message string, fields ...zap.Field) {
allFields := []zap.Field{zap.String("service", e.serviceName)}
allFields = append(allFields, fields...)
e.logger.Error(message, allFields...)
}
// Sync 同步日志
func (e *ExternalServiceLogger) Sync() error {
return e.logger.Sync()
}
// CleanupOldDateDirs 清理过期的日期目录
func (e *ExternalServiceLogger) CleanupOldDateDirs() error {
if !e.config.UseDaily {
return nil
}
logDir := filepath.Join(e.config.LogDir, e.serviceName)
// 读取日志目录
entries, err := os.ReadDir(logDir)
if err != nil {
return fmt.Errorf("读取日志目录失败: %w", err)
}
// 计算过期时间基于配置的MaxAge
maxAge := 28 // 默认28天
if errorConfig, exists := e.config.LevelConfigs["error"]; exists && errorConfig.MaxAge > 0 {
maxAge = errorConfig.MaxAge
}
cutoffTime := time.Now().AddDate(0, 0, -maxAge)
for _, entry := range entries {
if !entry.IsDir() {
continue
}
// 尝试解析目录名为日期
dirName := entry.Name()
dirTime, err := time.Parse("2006-01-02", dirName)
if err != nil {
// 如果不是日期格式的目录,跳过
continue
}
// 检查是否过期
if dirTime.Before(cutoffTime) {
dirPath := filepath.Join(logDir, dirName)
if err := os.RemoveAll(dirPath); err != nil {
return fmt.Errorf("删除过期目录失败 %s: %w", dirPath, err)
}
}
}
return nil
}
// startCleanupTask 启动定时清理任务
func (e *ExternalServiceLogger) startCleanupTask() {
// 每天凌晨2点执行清理
ticker := time.NewTicker(24 * time.Hour)
defer ticker.Stop()
// 等待到下一个凌晨2点
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day()+1, 2, 0, 0, 0, now.Location())
time.Sleep(time.Until(next))
// 立即执行一次清理
if err := e.CleanupOldDateDirs(); err != nil {
// 记录清理错误这里使用标准输出因为logger可能还未初始化
fmt.Printf("清理过期日志目录失败: %v\n", err)
}
// 定时执行清理
for range ticker.C {
if err := e.CleanupOldDateDirs(); err != nil {
fmt.Printf("清理过期日志目录失败: %v\n", err)
}
}
}
// GetServiceName 获取服务名称
func (e *ExternalServiceLogger) GetServiceName() string {
return e.serviceName
}