介绍

Logstash解析系统日志错误:

如果大家使用Logstash自带的解析规则,在某些情况下会出现解析系统日志失败的情况,原因是因为:系统主机名包含下划线时会解析失败,造成无法识别主机名字段。

主要是生产环境有些网络设备的主机名有带下划线_ ,而合法在主机名是没有不允许下划线的。

使用环境:Rocky Linux 8 、 ELK 8.x

HostName主要规则

  • 主机名只允许包含ascii字符里的数字0-9,字母a-zA-Z,连字符-。其他都不允许。例如,不允许出现其他标点符号,不允许空格,不允许下划线,不允许中文字符。
  • 主机名的开头和结尾字符不允许是连字符。
  • 主机名强烈建议不要用数字开头,尽管这一条不是强制的。甚至不要使用只包含可解释为16进制字符的字符串,例如”beef”。
  • 建议不要使用计算机领域的特殊的词汇,例如,up。
  • 给主机命名通常不考虑字母大小写问题,并且只用小写字母而不用大写字母。
  • 给主机命名,建议使用合法的单词,这样方便记忆。因为主机名是在一个domain的范围内唯一即可,通常不必担心重复问题。

修改

1
2
3
4
5
6
7
find /usr/share/logstash/vendor/ -name grok-patterns

/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-patterns-core-4.3.4/patterns/ecs-v1/grok-patterns
/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-patterns-core-4.3.4/patterns/legacy/grok-patterns

# 查找grok-patterns文件,因每个版本路径可能会更更改。上面两个文件都需要修改的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 使用vim编辑,注意版本不一样,路径会更改。

vim /usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-patterns-core-4.3.4/patterns/ecs-v1/grok-patterns
vim /usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-patterns-core-4.3.4/patterns/legacy/grok-patterns

# 找到并将

HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)

# 修改为


HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z_-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z_-]{0,62}))*(\.?|\b)

# 注意看两者多了两个下划线

PS:如果使用Filebeat的模块,也会出现这个问题。

1
2
3
4
5
6
systemctl restart logstash.service 

systemctl status logstash.service

# 修改保存完成之后,需要重启生效。

PS:如果Logstash 更新了,也需要再次修改。

参考

https://github.com/logstash-plugins/logstash-output-elasticsearch/issues/400

https://zhuanlan.zhihu.com/p/101154203

https://blog.csdn.net/wanghuiict/article/details/70038140