如何在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代码实现,需要先完成依赖安装和代码修正:
- 找到Logstash自带的Ruby路径,一般在
Logstash安装目录/vendor/ruby/<版本号>/bin下 - 执行
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
相关产品推荐
相关产品推荐

