Logstash syslog_pri过滤器解析异常求助及配置修正
问题诊断与修正方案
核心问题定位
你的问题根源在于grok未正确提取纯数字格式的syslog优先级字段,或者syslog_pri过滤器未指向正确的字段,导致过滤器无法解析有效优先级值,只能输出默认的user-level(设施)和notice(级别)。
诊断步骤
验证字段提取结果
临时修改Logstash输出为stdout,查看事件字段详情:output { stdout { codec => rubydebug } }重点检查是否存在
syslog_pri字段,且值为纯数字(如30而非<30>)。如果字段不存在或值带尖括号,说明grok匹配失败。检查grok模式正确性
预定义的%{SYSLOGPRI:syslog_pri}模式会自动匹配<数字>格式的优先级,并提取内部纯数字到指定字段。如果自定义模式(如%{DATA:syslog_pri})会提取带尖括号的完整字符串,导致syslog_pri过滤器无法解析。
修正后的完整配置示例
input { udp { port => 514 # 对应设备发送的syslog端口 type => "syslog" } } filter { if [type] == "syslog" { # 第一步:正确提取syslog优先级、时间、主机等字段 grok { match => { "message" => "^%{SYSLOGPRI:syslog_pri}%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:device_host} %{GREEDYDATA:message}" } overwrite => ["message"] # 覆盖原message,移除已解析的头部内容 tag_on_failure => ["_grokparsefailure"] # 解析失败时打标签,方便排查 } # 第二步:用提取的syslog_pri字段解析设施和级别 syslog_pri { # 若grok提取的字段名不是syslog_pri,需用field参数指定,例如:field => "pri" } # 可选:将syslog时间戳转为Logstash时间 date { match => ["syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss"] target => "@timestamp" } } } output { elasticsearch { hosts => ["http://your-es-host:9200"] index => "syslog-%{+YYYY.MM.dd}" } }
关键说明
- syslog优先级计算逻辑:设施(facility)= 优先级值 // 8,级别(severity)= 优先级值 % 8。例如优先级
14:- 14 // 8 = 1 → 对应设施
security/auth - 14 % 8 = 6 → 对应级别
alert
- 14 // 8 = 1 → 对应设施
- 避免自定义模式错误:务必使用
%{SYSLOGPRI}预定义模式,不要手动匹配<数字>,防止格式兼容问题。 - 失败排查:若出现
_grokparsefailure标签,需检查日志格式是否与grok模式匹配,可使用本地或在线的grok调试工具验证模式。
内容的提问来源于stack exchange,提问作者mondychan
相关产品推荐
相关产品推荐

