severity:定义日志的级别,例如debug,info,notice等,默认是error
Server端Rsyslog配置 # cat /etc/rsyslog.d/rsyslog_nginx_kafka_cluster.conf module(load="imudp") input(type="imudp" port="514") # nginx access log ==> rsyslog server(local) ==> kafka module(load="omkafka") template(name="nginxLog" type="string" string="%msg%") if $inputname == "imudp" then { if ($programname == "nginx_access_log") then action(type="omkafka" template="nginxLog" broker=["10.82.9.202:9092","10.82.9.203:9092","10.82.9.204:9092"] topic="rsyslog_nginx" partitions.auto="on" confParam=[ "socket.keepalive.enable=true" ] ) } :rawmsg, contains, "nginx_access_log" ~1.在rsyslog.d目录下添加一个专门处理nginx日志的配置文件
2.rsyslog配置文件重要配置解释如下:
module:加载模块,这里我们需要加载imudp模块来接收nginx服务器syslog发过来的日志数据,也需要加载omkafka模块来将日志写入到kafka
input:开启udp协议,端口514,也可以同时开启tcp协议,两者可以共存
template:定义一个模板,名字叫nginxLog,模板里可以定义日志的格式,因为我们传的已经是json了,不需要再匹配格式,所以这里不额外定义,注意模板名字要唯一
action:在匹配到inputname为imudp且programname为nginx_access_log(就是我们上边nginx配置里边的tag)之后的处理方式,这里的配置为匹配到的日志通过omkafka模块写入kafka集群,还有一些关于omkafka更详细的配置参考上边给出的omkafka模块官方文档
:rawmsg, contains:最后这一行的意思是忽略包含nginx_access_log的日志,没有这一行的话rsyslog服务默认会把所有日志都记录到message里边一份,我们已经把日志输出到kafka了,本地就没必要再记录了
3.omkafka模块检查kafka里边topic是否存在,如果不存在则创建,无需手动创建kafka的topic
Server端logstash配置 input { kafka { bootstrap_servers => "10.82.9.202:9092,10.82.9.203:9092,10.82.9.204:9092" topics => ["rsyslog_nginx"] } } filter { mutate { gsub => ["message", "\\x", "\\\x"] } json { source => "message" } date { match => ["time_local","dd/MMM/yyyy:HH:mm:ss Z"] target => "@timestamp" } } output { elasticsearch { hosts => ["10.82.9.205", "10.82.9.206", "10.82.9.207"] index => "rsyslog-nginx-%{+YYYY.MM.dd}" } }重要配置参数解释如下:
input:配置kafka的集群地址和topic名字
filter:一些过滤策略,因为传入kafka的时候是json格式,所以不需要额外处理,唯一需要注意的是如果日志中有中文,例如url中有中文内容时需要替换\\x,不然json格式会报错
output:配置ES服务器集群的地址和index,index自动按天分割
联调测试配置完成后分别重启rsyslog服务和nginx服务,访问nginx产生日志
1.查看kafka是否有正常生成topic
# bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181 __consumer_offsets rsyslog_nginx2.查看topic是否能正常接收日志
# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic rsyslog_nginx {"host": "domain.com","server_addr": "172.17.0.2","http_x_forwarded_for":"58.52.198.68","remote_addr":"10.120.89.84","time_local":"28/Aug/2018:14:26:00 +0800","request_method":"GET","request_uri":"http://www.likecs.com/","status":200,"body_bytes_sent":1461,"http_referer":"-","http_user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36","upstream_addr":"-","upstream_status":"-","upstream_response_time":"-","request_time":0.000}3.kibana添加index,查看Elasticsearch中是否有数据,如果前两步都正常,kibana搜不到index或index没有数据,多半是index名字写错了之类的基础问题,仔细检查
kibana查询展示打开Kibana添加rsyslog-nginx-*的Index,并选择timestamp,创建Index Pattern
进入Discover页面,可以很直观的看到各个时间点请求量的变化,根据左侧Field实现简单过滤,例如我们想查看所有访问状态为404的uri,可以点击request_uri和status后边的add,这两项的内容将出现在右侧,然后点击status下边404状态码后边的加号,则只查看状态为404的请求,点击上方auto-refresh可以设置页面自动刷新时间
通过各种条件的组合查询可以实现各种各样的需求,例如每秒请求、带宽占用、异常比例、慢响应、TOP IP、TOP URL等等各种情况,并且可以通过Visualize很方便的将这些信息绘制图标,生成Dashboard保存