本项目实现了一个灵活的插件架构,允许您轻松添加自定义的日志解析器,而无需修改核心代码。
- 插件注册系统:自动注册和发现日志处理器
- 配置驱动:通过 YAML 配置文件定义新的日志解析器
- 模板化实现:提供通用基础类,减少重复代码
- 向后兼容:保留原有接口,确保现有代码继续工作
- 自文档化:提供丰富的处理器元数据,方便用户了解
您可以通过以下三种方式添加自定义日志解析器:
最简单的方式是在配置文件中定义您的日志解析器。只需编辑config/log_parsers.yaml文件,添加您的解析器定义:
parsers:
- name: my-custom-log
display_name: 我的自定义日志
description: 处理我的自定义日志文件
log_dir: /my_app
file_pattern: '\.(\d{8}-\d{6})'
file_time_format: "20060102-150405"
line_pattern: '\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\]'
line_time_format: "2006-01-02 15:04:05.000"
file_extensions: [".log"]配置参数说明:
name: 解析器唯一标识符,用于内部引用display_name: 显示名称,更友好的名称description: 描述解析器的功能log_dir: 日志目录(相对于基础日志目录)file_pattern: 用于从文件名提取时间戳的正则表达式file_time_format: 文件名中时间戳的格式(Go 时间格式)line_pattern: 用于从日志行提取时间戳的正则表达式line_time_format: 日志行中时间戳的格式(Go 时间格式)file_extensions: 要处理的文件扩展名列表
您可以使用我们提供的基础模板来实现自定义解析器:
package my_custom_log
import (
"logsnap/collector"
"logsnap/collector/processor/base"
"logsnap/collector/registry"
"regexp"
)
func init() {
// 定义正则表达式
filePattern := regexp.MustCompile(`\.(\d{8}-\d{6})`)
linePattern := regexp.MustCompile(`\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\]`)
// 创建配置
config := base.LogProcessorConfig{
Name: "我的自定义日志",
LogDir: "/my_app",
OutputDir: "/my_app",
FilePattern: filePattern,
FileTimeFormat: "20060102-150405",
LinePattern: linePattern,
LineTimeFormat: "2006-01-02 15:04:05.000",
FileExtensions: []string{".log"},
}
// 注册处理器
registry.RegisterProcessor(registry.ProcessorRegistration{
Type: "my-custom-log",
Name: "我的自定义日志",
Description: "处理我的自定义日志文件",
Factory: func(logDir, outputDir string) (collector.LogProcessor, error) {
// 调整路径
config := config
config.LogDir = logDir + config.LogDir
config.OutputDir = outputDir + config.LogDir
return base.CreateLogProcessor(config), nil
},
})
}将此文件保存为collector/processor/my_custom_log/my_custom_log.go,并在您的应用程序中导入此包。
如果您需要完全自定义的实现,可以:
- 创建自己的包和类型
- 实现必要的接口
- 在
init()函数中注册您的处理器
例如:
package my_custom_log
import (
"logsnap/collector"
"logsnap/collector/registry"
// 其他必要的导入
)
type MyCustomLogProcessor struct {
// 实现您自己的处理器
}
func NewMyCustomLogProcessor(logDir, outputDir string) *MyCustomLogProcessor {
// 创建处理器
}
// 实现 LogProcessor 接口的所有必要方法
// ...
func init() {
// 注册处理器
registry.RegisterProcessor(registry.ProcessorRegistration{
Type: "my-custom-log",
Name: "我的自定义日志",
Description: "处理我的自定义日志文件",
Factory: func(logDir, outputDir string) (collector.LogProcessor, error) {
return NewMyCustomLogProcessor(logDir+"/my_app", outputDir+"/my_app"), nil
},
})
}要使用配置文件定义的日志处理器,您可以运行提供的示例程序:
go run cmd/examples/plugin_demo.go /path/to/logs /path/to/output [/path/to/config.yaml]或者在您自己的代码中:
import (
"logsnap/collector/config"
"logsnap/collector/factory"
)
// 加载配置文件
config.LoadConfigFromFile("config/log_parsers.yaml")
// 创建处理器
processor, err := factory.CreateProcessor("my-custom-log", "/path/to/logs", "/path/to/output")
if err != nil {
// 处理错误
}
// 使用处理器
output, results, err := processor.Collect(startTime, endTime, "/path/to/output")如果您的日志解析器没有按预期工作,请检查:
- 配置文件语法是否正确
- 正则表达式是否匹配您的日志文件名和日志行
- 时间格式是否与您的日志时间戳格式匹配
- 日志目录路径是否正确
- 文件扩展名是否包含了所有需要处理的文件类型