Skip to content

Latest commit

 

History

History
175 lines (136 loc) · 4.93 KB

File metadata and controls

175 lines (136 loc) · 4.93 KB

日志解析器插件架构

本项目实现了一个灵活的插件架构,允许您轻松添加自定义的日志解析器,而无需修改核心代码。

特点

  • 插件注册系统:自动注册和发现日志处理器
  • 配置驱动:通过 YAML 配置文件定义新的日志解析器
  • 模板化实现:提供通用基础类,减少重复代码
  • 向后兼容:保留原有接口,确保现有代码继续工作
  • 自文档化:提供丰富的处理器元数据,方便用户了解

添加自定义日志解析器的三种方式

您可以通过以下三种方式添加自定义日志解析器:

1. 使用配置文件

最简单的方式是在配置文件中定义您的日志解析器。只需编辑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: 要处理的文件扩展名列表

2. 使用通用模板代码

您可以使用我们提供的基础模板来实现自定义解析器:

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,并在您的应用程序中导入此包。

3. 完全自定义实现

如果您需要完全自定义的实现,可以:

  1. 创建自己的包和类型
  2. 实现必要的接口
  3. 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")

调试提示

如果您的日志解析器没有按预期工作,请检查:

  1. 配置文件语法是否正确
  2. 正则表达式是否匹配您的日志文件名和日志行
  3. 时间格式是否与您的日志时间戳格式匹配
  4. 日志目录路径是否正确
  5. 文件扩展名是否包含了所有需要处理的文件类型