You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Logstash配置文件中添加Ruby代码及解决Windows事件日志发送报错

1. 在Logstash配置中添加Ruby代码的方法

在Logstash里,你可以通过ruby过滤器插件嵌入Ruby代码,通常放在filter区块中。具体写法是用ruby {}代码块,通过code参数传入你的Ruby逻辑:

filter {
  ruby {
    code => "
      # 这里写你的Ruby代码逻辑
      # 示例:给事件添加一个新字段
      event.set('processed_by_ruby', true)
    "
  }
}

需要注意几个细节:

  • Logstash有独立的Ruby运行环境,和系统Ruby不共享gem包,如果你的代码依赖第三方gem(比如win32/eventlog),得先在Logstash的Ruby环境中安装对应依赖
  • 操作Logstash事件数据时,必须用官方提供的event对象方法:比如event.get('field_name')获取字段值,event.set('field_name', value)设置字段,别直接修改原始数据结构
  • 复杂的Ruby逻辑也可以写到外部文件里,用path参数替代code,比如path => "/opt/logstash/scripts/my_ruby_logic.rb"

2. 解决Logstash发送日志到Windows事件日志的报错问题

从你给出的代码片段来看,你遇到的问题大概率是两个原因:一是Logstash环境没安装win32/eventlog依赖gem,二是report_event的参数不完整。下面给你两种可行的解决方案:

方案一:用官方Windows事件日志输出插件(推荐)

Logstash有专门的logstash-output-windows_eventlog插件,比自己写Ruby代码更稳定,不用手动处理依赖问题。

首先安装插件(在Logstash的bin目录下执行命令):

logstash-plugin install logstash-output-windows_eventlog

然后修改你的配置,添加output区块:

input {
  file {
    type => "json"
    path => ["C:/Temp/logs/*.json"]
    start_position => "beginning"
    codec => "json"
    discover_interval => 120
    stat_interval => 60
    sincedb_write_interval => 60
    close_older => 60
  }
}

filter {
  mutate {
    remove_field => [ "path" ]
  }
}

output {
  windows_eventlog {
    source => "Logstash" # 自定义事件源名称
    event_id => 1000 # 自定义事件ID
    message => "%{message}" # 用日志中的message字段作为事件内容
    event_type => "information" # 事件类型,可选information/warning/error
  }
}

方案二:修复自定义Ruby代码的问题

如果你坚持用Ruby代码实现,需要先完成依赖安装和代码修正:

  1. 找到Logstash自带的Ruby路径,一般在Logstash安装目录/vendor/ruby/<版本号>/bin下
  2. 执行gem install win32-eventlog安装依赖gem

然后修正你的Ruby代码,确保report_event参数完整:

filter {
  mutate {
    remove_field => [ "path" ]
  }
  ruby {
    code => "
      require 'win32/eventlog'

      # 初始化事件日志对象,指定日志通道和事件源
      logger = Win32::EventLog.new('Application', 'localhost')
      
      # 上报事件,参数必须齐全
      logger.report_event(
        :event_type => Win32::EventLog::INFO_TYPE,
        :message => event.get('message'), # 从Logstash事件中获取内容
        :source => 'LogstashCustom',
        :event_id => 1001
      )
    "
  }
}

注意:用这种方式时,要确保运行Logstash的用户有写入Windows事件日志的权限;如果用自定义事件源,可能需要提前在Windows注册表中完成注册。

内容的提问来源于stack exchange,提问作者Penguen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:37:25