在“Splunk:使用syslog-ng和HF(UF)收集syslog日志(一)”一文中写了整体的配置,这部分详细讲讲源端(nginx)这部分的配置细节。
一、配置关系图
(加入知识星球“企业Splunk实践”查看高清大图)
二、Nginx access日志配置
配置说明
在nginx.conf文件里或站点配置文件里配置即可,log_format指定日志格式,access_log指定日志存储路径,这里主要说明下access_log的配置。
access_log syslog:server=unix:/usr/local/nginx/logs/nginxaccess.sock,tag=nginx_access,nohostname nginxjsonupstream;
“syslog:”:通过syslog记录;
“server=unix:/usr/local/nginx/logs/nginxaccess.sock”:指定UNIX-domain socket路径,不用手动创建该文件;
“tag=nginx_access”:设定syslog tag,默认为nginx;
“nohostname”:在syslog header中不添加hostname;
“nginxjsonupstream”:指定log_format;
这里还有几个参数可以设定:
“facility”:指定syslog facility,默认为local7;
“severity”:指定syslog severity,默认为info;
tag、facility、severity这几个参数可以根据实际情况修改,这几个参数很重要,在后面rsyslog、syslog-ng配置中我们都会用到这几个值。
参考资料
Configuring Logging:
https://www.nginx.com/resources/admin-guide/logging-and-monitoring/
Module ngx_http_log_module:
http://nginx.org/en/docs/http/ngx\_http\_log\_module.html
Logging to syslog
http://nginx.org/en/docs/syslog.html
三、Rsyslog配置
配置说明
rsyslog配置部分,我们先说说以下部分。
第一部分nginx日志处理,按照实际配置关系,我们按照颜色单独分作两部分:
template(name="T_nginxaccess_remote" type="string" string="%syslogtag% %msg%\n")
template(name="T_nginxaccess_local" type="string" string="%msg%\n")
template(name="T_nginxaccess_File" type="string" string="/usr/local/nginx/logs/access_%$year%-%$month%-%$day%.log")
ruleset(name="nginxaccessrule") {
action(type="omfile" dynaFile="T_nginxaccess_File" Template="T_nginxaccess_local" ioBufferSize="1512k" flushOnTXEnd="off" asyncWriting="on")
action(type="omfwd" Target="10.100.18.28" Port="1515" Protocol="tcp" Template="T_nginxaccess_remote" )
}
input(type="imuxsock" Ruleset="nginxaccessrule" Socket="/usr/local/nginx/logs/nginxaccess.sock")
具体的配置语法请查看参考资料。
红色部分是将日志记录到本地:
dynaFile="T_nginxaccess_File":指定日志存储路径及命名为按天生成;
Template="T_nginxaccess_local":指定日志格式,具体的日志格式为string="%msg%\n";
我们从实际access日志可以看到,日志格式和在nginx上配置的log_format格式是一样的,也就是说%msg%这个字段就等于:
{"@timestamp":"$time_iso8601",'
'"hostaddr":"$server_addr",'
'"remote_addr":"$remote_addr",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"request_method":"$request_method",'
'"domain":"$host",'
'"uri":"$uri",'
'"request_uri":"$scheme://$http_host$request_uri",'
'"status":$status,'
'"server_protocol":"$server_protocol",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"http_referer":"$http_referer",'
'"upstr_addr": "$upstream_addr",'
'"upstr_status": $upstream_status,'
'"ups_resp_time": $upstream_response_time,'
'"accept":"$http_accept",'
'"agent": "$http_user_agent"}'
蓝色部分是将日志发往syslog-ng服务器:
Target="10.100.18.28":服务器IP
Port="1515":端口
Protocol="tcp":协议
Template="T_nginxaccess_remote" :日志发出去的格式
请注意:
在这我们定义的日志格式是string="%syslogtag% %msg%\n",和本地定义的格式string="%msg%\n"不一样。
但是,大家可以看看第一篇文章中的图,我们最终在syslog-ng服务器(10.100.18.28)上记录的acces日志格式是和本地(10.100.18.247)记录的access日志格式是一样的。
那么有两个问题:
1、为什么定义的格式不一样,但是最终记录的日志格式是一样的?
2、为什么需要再发往syslog-ng服务器时,加上“%syslogtag% ”部分,作用是什么?
这部分非常重要,后续我们在syslog-ng配置部分再讲。
第二部分linux服务器日志处理:
*.info,local7.none @@10.100.18.28:1515
这部分的配置是把linux的系统日志*.info都发给了syslog-ng服务器。
@@:代表TCP方式,如果是@代表UDP;
10.100.18.28:syslog-ng服务器IP;
1515:端口;
这里为什么加上local7.none,在nginx配置部分我们知道nginx通过syslog记录日志的时候,默认facility是local7,severity是info。这边加上local7.none就不会再把nginx日志重复发一份到syslog-ng服务器(因为我们上边已经发了一份了)。
参考资料
Configuration:
http://www.rsyslog.com/doc/v8-stable/configuration/index.html
加入星球查看更多内容: