ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

常规的日志收集方案中Client端都需要额外安装一个Agent来收集日志,例如logstash、filebeat等,额外的程序也就意味着环境的复杂,资源的占用,有没有一种方式是不需要额外安装程序就能实现日志收集呢?Rsyslog就是你要找的答案!

Rsyslog

Rsyslog是高速的日志收集处理服务,它具有高性能、安全可靠和模块化设计的特点,能够接收来自各种来源的日志输入(例如:file,tcp,udp,uxsock等),并通过处理后将结果输出的不同的目的地(例如:mysql,mongodb,elasticsearch,kafka等),每秒处理日志量能够超过百万条。

Rsyslog作为syslog的增强升级版本已经在各linux发行版默认安装了,无需额外安装。

收集Nginx日志

ELK通过Rsyslog收集日志流程图如下:

ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

处理流程为:Nginx --syslog--> Rsyslog --omkafka--> Kafka --> Logstash --> Elasticsearch --> Kibana

Nginx产生日志通过syslog系统服务传给Rsyslog服务端,Rsyslog接收到日志后通过omkafka模块将日志写入Kafka,Logstash读取Kafka队列然后写入Elasticsearch,用户通过Kibana检索Elasticsearch里存储的日志

Rsyslog服务系统自带无需安装,所以整个流程中客户端不需要额外安装应用

服务端虽然Rsyslog也已安装,但默认没有omkafka模块,如果需要Rsyslog写入Kafka需要先安装这个模块

omkafka模块在rsyslog v8.7.0之后的版本才支持,所以需要先通过rsyslogd -v命令查看rsyslog版本,如果版本较低则需要升级

Rsyslog升级

1.添加rsyslog源的key

# apt-key adv --recv-keys --keyserver keys.gnupg.net AEF0CF8E

2.添加rsyslog源地址

echo "deb wheezy/" >> /etc/apt/sources.list echo "deb-src wheezy/" >> /etc/apt/sources.list

3.升级rsyslog服务

# apt-get update && apt-get -y install rsyslog 添加omkafka模块

1.安装编译工具,下边autoreconf需要用到,不然无法生成configure文件

# apt-get -y install pkg-config autoconf automake libtool unzip

2.omkafka需要安装一堆的依赖包

# apt-get -y install libdbi-dev libmysqlclient-dev postgresql-client libpq-dev libnet-dev librdkafka-dev libgrok-dev libgrok1 libgrok-dev libpcre3-dev libtokyocabinet-dev libglib2.0-dev libmongo-client-dev libhiredis-dev # apt-get -y install libestr-dev libfastjson-dev uuid-dev liblogging-stdlog-dev libgcrypt-dev # apt-get -y install flex bison librdkafka1 librdkafka-dev librdkafka1-dbg

3.编译安装omkafka模块

# mkdir tmp && cd tmp # git init # git pull git@github.com:VertiPub/omkafka.git # autoreconf -fvi # ./configure --sbindir=http://www.likecs.com/usr/sbin --libdir=http://www.likecs.com/usr/lib --enable-omkafka && make && make install && cd .. Rsyslog收集nginx日志 Client端Nginx配置 log_format jsonlog '{' '"host": "$host",' '"server_addr": "$server_addr",' '"http_x_forwarded_for":"$http_x_forwarded_for",' '"remote_addr":"$remote_addr",' '"time_local":"$time_local",' '"request_method":"$request_method",' '"request_uri":"$request_uri",' '"status":$status,' '"body_bytes_sent":$body_bytes_sent,' '"http_referer":"$http_referer",' '"http_user_agent":"$http_user_agent",' '"upstream_addr":"$upstream_addr",' '"upstream_status":"$upstream_status",' '"upstream_response_time":"$upstream_response_time",' '"request_time":$request_time' '}'; access_log syslog:server=rsyslog.domain.com,facility=local7,tag=nginx_access_log,severity=info jsonlog;

1.Nginx在v1.10之后的版本才支持syslog的方式处理日志,请确保你的Nginx版本高于1.10

2.为了降低logstash的处理压力,同时也为了降低整个配置的复杂度,我们nginx的日志直接采用json格式

3.抛弃文本文件记录nginx日志,改用syslog直接将日志传输到远端的rsyslog服务器,以便我们后续的处理;这样做的另一个非常重要的好处是我们再也无需考虑nginx日志的分割和定期删除问题(一般我们为了方便管理通常会采用logrotate服务来对日志进行按天拆分和定期删除,以免磁盘被占满)

4.access_log直接输出到syslog服务,各参数解释如下:

syslog:指明日志用syslog服务接收

server:接收syslog发送日志的Rsyslog服务端地址,默认使用udp协议,端口是514

facility:指定记录日志消息的类型,例如认证类型auth、计划任务cron、程序自定义的local0-7等,没有什么特别的含义,不必深究,默认的值是local7

tag:给日志添加一个tag,主要是为了方便我们在服务端区分是哪个服务或者client传来的日志,例如我们这里给了tag:nginx_access_log,如果有多个服务同时都写日志给rsyslog,且配置了不通的tag,在rsyslog服务端就可以根据这个tag找出哪些是nginx的日志

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfjyj.html