Logstash对接Cisco设备syslog字符编码异常问题求助
解决Cisco设备向Logstash发送syslog的编码错误问题
我来帮你排查这个编码问题——你已经尝试调整了codec的charset,但可能没抓住Cisco设备syslog的特殊点:
问题根源
你日志里出现的0\x82\u0002B这类字符,是Cisco设备可能发送的二进制控制字符,它们不属于标准的ISO-8859-1可打印字符范围。虽然你指定了charset => "ISO-8859-1",但Logstash的plain codec在遇到这类非文本字符时,还是会触发编码不匹配的警告。
另外,用plain codec处理syslog本身就不是最优选择,因为syslog有固定格式,专门的syslog codec能更好地兼容不同设备的输出。
解决方案
试试下面几个步骤,按优先级来:
1. 替换为syslog codec
把input部分的plain codec换成syslog codec,它会自动处理syslog格式的编码兼容问题:
input { udp { port => 514 type => syslog codec => syslog { charset => "ISO-8859-1" } } }
2. 过滤无效控制字符
如果换codec后还是有警告,就在filter里添加mutate插件,清理掉消息里的非打印/无效字符:
filter { if [type] == "syslog" { # 先清理掉非ASCII和非ISO-8859-1可打印的字符 mutate { gsub => [ "message", "[^\x00-\x7F\xC0-\xFF]", "" ] } # 你的原有grok和date配置 grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } add_field => [ "received_at", "%{@timestamp}" ] add_field => [ "received_from", "%{host}" ] } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } }
这个gsub规则会保留ASCII和ISO-8859-1的可打印字符,去掉那些二进制控制字符。
3. 检查Logstash版本
如果你的Logstash是2.x或更早的旧版本,plain codec的charset处理可能存在bug,建议升级到最新的稳定版(比如7.x或8.x),新版本对编码兼容的处理更完善。
验证方法
修改配置后重启Logstash,然后让Cisco设备发送测试日志,观察Logstash的警告是否消失,同时检查Elasticsearch里的日志内容是否正常显示。
内容的提问来源于stack exchange,提问作者Hannes
相关产品推荐
相关产品推荐

