Logstash 管理
file输入插件
使用Logstash file 输入插件读取本地系统日志文件/var/log/messages,实时采集日志并写入 Elasticsearch
编写 file 插件采集配置 # cd /etc/logstash/conf.d # vim test.conf input { file { path => "/var/log/messages" start_position => "beginning" } } # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf当 Logstash 第一次发现这个文件时,从文件开头读取
sincedb 作用
1.sincedb 文件里保存日志文件的读取偏移量(读到文件哪个字节位置);
2.Logstash 重启后,读取 sincedb 记录,不会重复采集已经读过的日志,避免数据冗余、重复写入 ES;
3.sincedb 文件名由日志文件 inode 编号哈希生成。
4.想要强制从头重新读取日志:
先停止 Logstash
删除对应的 sincedb 文件
重启 Logstash
.sincedb文件保存文件读取进度,避免数据冗余读取 # cd /usr/share/logstash/data/plugins/inputs/file # l. . .. .sincedb_452905a167cf4509fd08acb964fdb20c # ls -i /var/log/messages 50695316 /var/log/messages 删除后重新读取 # rm -f .sincedb_452905a167cf4509fd08acb964fdb20c下方截图可以看到:日志成功进入 ES 索引messages-2026.08.11。
自动生成索引:
messages-2026.08.11(由 output 里 index 模板定义按日期生成索引)原始日志内容被提取到
message字段,可以看到原始日志文本/var/log/messages相关系统日志;
再写入一条messages # cd /usr/share/logstash/data/plugins/inputs/file/ # logger helloworld # tail -1 /var/log/messages Aug 11 14:38:10 server5 root: helloworld日志写入/var/log/messages之后,Logstash 实时监听到文件新增内容,自动采集,很快在 Elasticsearch 的messages-2026.08.11索引中出现这条helloworld日志。
syslog 插件
Logstash syslog 插件负责监听 514 端口,接收其他服务器 rsyslog 推送过来、遵守 syslog 协议的日志,并自动解析字段。
Logstash 服务端配置(接收端 server5) [root@server5 conf.d]# vim test.conf input { syslog {} } output { stdout {} elasticsearch { hosts => "192.168.36.170:9200" index => "syslog-%{+YYYY.MM.dd}" } } [root@server4 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf 配置客户端日志输出 [root@server1 ~]# vim /etc/rsyslog.conf 去掉注释: *.* @@192.168.223.174:514 [root@server1 ~]# systemctl restart rsyslog.serviceLogstash 内置 syslog 输入插件,默认监听 UDP 514 端口,等待其他主机 rsyslog 推送日志。
符号重点解释
*.*:所有设施、所有级别日志全部转发;
@@= TCP 协议发送 syslog;
@= UDP 协议发送 syslog;
192.168.223.174:514:Logstash 服务端 IP+514 端口。
在server1.2.3执行 # vim /etc/rsyslog.conf 去掉以下行的注释 $ModLoad imudp $UDPServerRun 514 *.* @@192.168.223.174:514 # systemctl restart rsyslog.service # logger server2logger xxx命令会向本机/var/log/messages写入一条日志,同时 rsyslog 会把这条日志转发给 Logstash。
代表 server3 执行logger server3产生的测试日志成功被 Logstash 收到。
说明Elasticsearch 中存储的数据 ,日志自带自动解析字段:
·host:产生日志的源服务器主机名(server1/server2/server3)
Logstash 多行过滤插件:multiline 过滤器
作用
日志场景常见:一条业务报错会分成多行打印(Java 异常堆栈、Python 报错、程序调用栈) 示例原始日志:
2026-08-11 10:00:00 INFO 启动服务 2026-08-11 10:00:05 ERROR 出现异常 java.lang.NullPointerException at Test.main(Test.java:20) ...如果不做多行处理,Logstash 会把每一行当成单独一条日志。
multiline多行过滤器:把属于同一个事件的连续多行日志合并成单条日志。
从server1拷贝模板文件 [root@server1 ]# cd /var/log/elasticsearch [root@server1 elasticsearch]# scp my-es.log server5:/var/log/ [root@server5 conf.d]# vim test.conf先将下面的行注释掉进行测试
图中的报错是由于注释掉了
multiline编解码器:把堆栈异常、多行日志合并成一条完整日志。导致出现了一条完整日志变为多行日志报错。
解决方法:删除myeslog,,让其重新生成,并且删除/usr/share/logstash/data/plugins/inputs/file/下面的“. 文件”;取消注释,再重新执行命令
# cd /usr/share/logstash/data/plugins/inputs/file/ [root@server5 file]# ls [root@server5 file]# l. . .. .sincedb_4d10e6fb4e3ffdf0fe00d1ce0f25b0fd [root@server5 file]# rm -f .sincedb_4d10e6fb4e3ffdf0fe00d1ce0f25b0fdLogstash Grok 过滤器
作用
原始非结构化文本日志 → 切割成结构化字段绝大多数系统、应用日志是一整串文本,没有字段。
grok使用正则模板把一行日志拆分出:时间、级别、进程、IP、URL、状态码等独立字段,方便 ES 检索、Kibana 筛选。
[root@server4 ~]# yum install -y httpd [root@server4 ~]# systemctl enablel --now httpd [root@server4 ~]# echo helloword > /var/www/html/index.html 访问此站点生成日志信息 [root@k8s1 ~]# ab -c1 -n 100 http://192.168.223.174/index.html进入 Logstash 配置文件目录
编辑名为
grok.conf的配置文件(采集 Apache 日志 + grok 解析)指定配置文件启动 Logstash
# cd /etc/logstash/conf.d/ # vim grok.conf # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/grok.conf
- 日志已经成功发送存入 Elasticsearch,索引名称:
apachelog-2026.08.11- 弹窗展开了单条日志完整 JSON,和第一张控制台输出的日志内容完全一致
- ES 中完整保留了 grok 解析出来的所有字段:
clientip、response、verb、agent等
