快两个月没写笔记了,工作中遇到了日志采集处理的问题,就回来学习、测试下通过Syslog采集日志。
Syslog
简单介绍
Syslog一般用于收集各种设备的日志进行集中处理。Linux上自带rsyslog,兼容Syslog语法,在Syslog基础上增加了更多协议的支持,配合额外module插件可以完成很多场景的使用。可以查看下当前的版本:
1 | $ rsyslogd -version |
在RFC 3164中定义了Syslog的Facility、Severity等。其中Facility可以理解为日志类型或者日志设备,就是标记由谁产生的日志:
1 | Numerical Facility |
Nginx在设置Facility时,默认是local7。Severity用于设置日志级别:
1 | Numerical Severity |
服务器模式
当需要rsyslog以服务器模式运行时,需要编辑配置文件/etc/rsyslog.conf
,取消UDP、TCP的注释:
1 | # provides UDP syslog reception |
修改完以后重启rsyslog服务,可以通过netstat查看开放端口。
Nginx配置
我这里使用Nignx进行测试,新建一个最小配置文件,为了方便后续的日志分析,将日志格式修改为json格式,定义名字为jsonlog
,其中将access_log以jsonlog
的格式记录在指定path,并发送到指定的syslog server。需要注意severity=info jsonlog
,如果只配置了日志级别,没有指定jsonlog
,那么发送给syslog server的数据是default格式的。
1 | http { |
如果上面启动了服务器模式,可以在syslog server所在机器上查看日志:
1 | tail -f /var/log/syslog |
如果因为权限问题,无法登录syslog server,可以在curl发起请求之前,启动tcpdump抓包查看日志是否发送正常,是否为JSON格式,下面我抓取的数据包,通过Wireshark可以看到Syslog记录:
场景一
这里的收集方案:假设Nginx在A机器,Logstash配置成的syslog服务器在B机器。
发送到ElasticSearch
如果使用Logstash收集日志,那么需要暂停B机器上的rsyslog服务(注释UDP、TCP,重启服务)。启动logstash之前,需要新建一个配置文件,我直接放在config目录中了。
1 | $ cat config/geo-syslog.conf |
启动Logstash,注意因为使用了514端口,这里需要用root用户启动,实际使用时可以用非知名端口:
1 | ./bin/logstash -f config/geo-syslog.conf |
启动成功,向Nignx服务发起curl请求后,在Kibana中查看index数据:
1 | { |
发送到其他程序
如果需要通过Logstash output到其他程序进行二次处理,比如我要通过UDP接收logstash发送过来的数据,修改配置文件:
1 | output { |
如果需要安装插件,可以通过如下命令:
1 | ./bin/logstash-plugin install logstash-output-udp |
已经安装了哪些插件,可以通过如下命令查看:
1 | ./bin/logstash-plugin list |
在接收端收到的消息和在Kibana中看到的一致:
1 | {"severity":6,"facility":23,"priority":190,"logsource":"tmp","@timestamp":"2021-09-11T14:07:54.000Z","timestamp":"Sep 11 22:07:54","type":"geo-syslog","content":{"http_referrer":"","remote_addr":"192.168.0.118","time_local":"11/Sep/2021:22:07:54 +0800","http_user_agent":"curl/7.58.0","status":"200","request":"GET /geo/8.8.8.8 HTTP/1.1","body_bytes_sent":"277"},"facility_label":"local7","severity_label":"Informational","program":"nginx_geo_access_log"} |
场景二
这里的收集方案:假设Nginx在A机器,rsyslog运行在B机器,Nginx需要发送日志到syslog server,再由syslog server将日志发送Logstash。
配置rsyslog
在rsyslog服务器模式的基础上,需要在/etc/rsyslog.d
目录里增加配置:
1、在发送到Logstash之前将消息格式化为JSON格式,写入模板
1 | cat 01-json-template.conf |
2、扩展配置
1 | cat 60-output.conf |
其中@
代表使用UDP发送。
配置Logstash
1 | input { |
启动服务
1 | ./bin/logstash -f config/geo-syslog.conf |
启动以后在Kibana中会看到各种类型的日志:
1 | "_source" : { |
omelasticsearch
Rsyslog支持直接输出数据给Elasticsearch,但是需要安装模块:
1 | sudo apt install rsyslog-elasticsearch |
编辑扩展配置文件/etc/rsyslog.d/60-output.conf
,并重启Rsyslog服务:
1 | module(load="omelasticsearch") |
启动以后在Kibana中会看到各种类型的日志:
1 | "_source" : { |
参考
1、http://nginx.org/en/docs/syslog.html
2、https://datatracker.ietf.org/doc/html/rfc3164#section-4.1.1
3、https://tufin.medium.com/sending-nginx-access-logs-to-a-golang-server-over-syslog-98b9108f40e1
4、https://www.elastic.co/cn/blog/how-to-centralize-logs-with-rsyslog-logstash-and-elasticsearch-on-ubuntu-14-04
5、https://discuss.elastic.co/t/udp-listener-died-syslog-when-running-as-a-service/128890
6、https://askubuntu.com/questions/26237/difference-between-var-log-messages-var-log-syslog-and-var-log-kern-log
7、https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/ecosystem/rsyslog.html
8、https://rsyslog.readthedocs.io/en/latest/configuration/modules/omelasticsearch.html