[TOC]
Nginx配置fluentd
本文详细的介绍了通过fluentd把nginx日志转存。
1、fluentd介绍
Fluentd是一个完全开源免费的log信息收集软件,支持超过125个系统的log信息收集。
本质上,Fluentd可以分为客户端和服务端两种模块。客户端为安装在被采集系统中的程序,用于读取log文件等信息,并发送到Fluentd的服务端。服务端则是一个收集器。在Fluentd服务端,我们可以进行相应的配置,使其可以对收集到的数据进行过滤和处理,并最终路由到下一跳。下一跳可以是用于存储的数据库,如MongoDB, elasticsearch, 也可以是其他的数据处理平台,比如Hadoop。
2、fluentd安装和部署
2.1 安装前配置
ntp时间同步(重要)
yum install ntp
vim /etc/ntp.conf //添加要同步的时间服务器
/etc/init.d/ntpd start
文件打开数
查看当前设置
ulimit -n
增加最大文件打开数,修改/etc/security/limits.conf
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
修改/etc/sysctl.conf
,添加如下内容
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216
net.ipv4.tcp_rmem = 4096 12582912 16777216
net.ipv4.tcp_max_syn_backlog = 8096
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240 65535
配置生效
sysctl -p
2.2 安装fluentd
rpm形式安装
下载最新的yum源并安装
/etc/yum.repos.d/td.repo
//官方脚本
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
也可以直接设置repo
# cat /etc/yum.repos.d/td.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasuredata.com/2/redhat/$releasever/$basearch
gpgcheck=1
gpgkey=https://packages.treasuredata.com/GPG-KEY-td-agent
# yum install -y td-agent
启动fluend
$ /etc/init.d/td-agent start
Starting td-agent: [ OK ]
$ /etc/init.d/td-agent status
td-agent (pid 21678) is running...
查看状态
$ /etc/init.d/td-agent status
yum安装之后的配置文件
/etc/td-agent/td-agent.conf
对应配置文件路径
| 项目 路径
| 主配置文件 /etc/td-agent/td-agent.conf
| 主程序 /usr/sbin/td-agent
| 程序日志 /var/log/td-agent/td-agent.log
| ruby程序位置 /opt/td-agent/embedded/bin/ruby
| pid位置 /var/run/td-atent/td-agent.pid
查看默认主配置文件的配置
# egrep -v "^#|^$" /etc/td-agent/td-agent.conf
<match td.*.*>
@type tdlog
apikey YOUR_API_KEY
auto_create_table
buffer_type file
buffer_path /var/log/td-agent/buffer/td
<secondary>
@type file
path /var/log/td-agent/failed_records
</secondary>
</match>
<match debug.**>
@type stdout
</match>
<source>
@type forward
</source>
<source>
@type http
port 8888
</source>
<source>
@type debug_agent
bind 127.0.0.1
port 24230
</source>
默认配置下的监听状态
# netstat -utpln |grep ruby
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 818/ruby
tcp 0 0 0.0.0.0:24224 0.0.0.0:* LISTEN 823/ruby
tcp 0 0 127.0.0.1:24230 0.0.0.0:* LISTEN 823/ruby
udp 0 0 0.0.0.0:24224 0.0.0.0:* 823/ruby
测试
通过8888端口提交一条日志
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
查看输出的日志
# tail -n 1 /var/log/td-agent/td-agent.log
2018-02-09 00:09:06.719633187 +0800 debug.test: {"json":"message"}
以上就是官方给出的最简化的demo,作用不大,但可以初步理解fluentd的工作方式
3、CS结构
数据流的处理都是双向的,既有Input方向也有Output方向。
角色:
- 日志转发 //client承担此角色
- 日志聚合 //server扮演此角色
日志转发
通常安装在每个节点上以接收本地日志,一旦接收到数据,通过网络将其转发到server端。
日志聚合
接收转发而来的数据,缓冲,过滤并定期通过插件将数据上传到其他存储程序、本地文件等媒介中。
==client、server使用同一样部署方式,区别在于配置文件的不同。==
4、配置讲解
4.1 td-agent.conf
配置的组成部分
-
source
directives determine the input sources. -
match
directives determine the output destinations. -
filter
directives determine the event processing pipelines. -
system
directives set system wide configuration. -
label
directives group the output and filter for internal routing -
@include
directives include other files.
source: 定义输入,数据的来源,input方向
match:定义输出,下一步的去向,如写入文件,或者发送到指定软件存储。output方向
filter:定义过滤,也即事件处理流水线,一般在输入和输出之间运行,可减少字段,也可丰富信息。
system:系统级别的设置,如日志级别、进程名称。
label:定义一组操作,从而实现复用和内部路由。
@include:引入其他文件,和Java、python的import类似。
//使用最多的就是source、match、filter
例如一个source部分:
# 从 24224/tcp 接收数据
# This is used by log forwarding and the fluent-cat command
<source>
@type forward
port 24224
</source>
# 从9880/http协议接收数据
# http://this.host:9880/myapp.access?json={"event":"data"}
<source>
@type http
port 9880
</source>
//@type 是必须有的参数,指定类型就是指定使用的插件
//http:使 fluentd 转变为一个 httpd 端点,以接受进入的 http 报文。
//forward:使 fluentd 转变为一个 TCP 端点,以接受 TCP 报文。
5、插件介绍及安装
Fluentd有6种类型的插件(或者叫方法),分别是:
Input:完成输入数据的读取,由source部分配置
//常用类型:tail、http、forward、tcp、udp、exec
Parser:解析插件,常与输入、输处配合使用,多见于`format`字段后面
//常用类型:ltsv、json、自定义等
Output:完成输出数据的操作,由match部分配置
//常用配置:file、forward、copy、stdout、exec
filter:过滤插件
//常用配置:grep、ignore、record_transformer
Buffer:缓存插件,用于缓存数据
//常用配置:file、mem
Formatter:消息格式化的插件,用于输出,允许用户扩展和重新使用自定义输出格式
//常用类型:ltsv、json等
注意:out_forward 转发输出插件将事件转发到其他fluentd节点。 此插件支持负载平衡和自动故障切换,由
<server></server>
标记。 对于复制,请使用 out_copy 插件,
copy 输出插件将事件复制到多个输出。由<store></store>
标记
安装一些需要的插件的命令
/opt/td-agent/embedded/bin/gem install woothee fluent-plugin-woothee fluent-plugin-elasticsearch
安装指定版本插件
td-agent-gem install fluent-plugin-woothee --version=0.2.1
td-agent-gem install woothee --version=1.4.0
//'fluent-plugin-woothee' is a Fluentd filter plugin to parse UserAgent strings and to filter/drop specified categories of user terminals (like 'pc', 'smartphone' and so on).
yum安装的fluentd程序,
td-agent-gem
等价于/opt/td-agent/embedded/bin/gem
6、nginx日志配置样例
nginx日志格式ltsv
ltsv格式的日志可以简单的描述程kv形式,由于业务线上其他日志也是t进行分割的所以这里也采用了ltsv进行序列化
log_format ltsv "time:$time_local"
"\trealip:$remote_addr"
"\txffip:$http_x_forwarded_for"
"\treq:$request"
"\tstatus:$status"
"\tsize:$body_bytes_sent"
"\treferer:$http_referer"
"\tua:$http_user_agent"
"\treqtime:$request_time"
"\tvhost:$host" ;
client端配置
##pc端日志收集
<source>
type tail
format ltsv
path /log/nginx/www.itouzi.access.log
pos_file /log/buffer/posfile/mergeua.www.access.log.pos
tag mergeua.www.access.nginx
time_key time
time_format %d/%b/%Y:%H:%M:%S %z
</source>
##对日志中的ua进行合并和分类
# Merged ua
<match mergeua.**>
type woothee
key_name ua
add_prefix merged
merge_agent_info yes
</match>
##收集的数据由tcp协议转发到多个server的49875端口
## Multiple output
<match merged.mergeua.**>
type forward
<server>
name es01
host es01
port 49875
weight 60
</server>
<server>
name es02
host es02
port 49875
weight 60
</server>
</match>
server端配置
##定义收集来源和监听端口
<source>
@type forward
bind 10.10.10.10
port 49875
</source>
##对聚合的数据将ip转为地图地址,添加新的tag头部
<match merged.mergeua.www.access.nginx>
@type geoip
geoip_lookup_key realip
geoip_database /etc/td-agent/GeoLiteCity.dat
<record>
location_array '[${longitude["realip"]},${latitude["realip"]}]'
country_code3 ${country_code3["realip"]}
country ${country_code["realip"]}
city ${city["realip"]}
</record>
skip_adding_null_record true
add_tag_prefix geoip.
</match>
##聚合pc端数据复制到es和本地文件
<match geoip.merged.mergeua.www.access.nginx>
@type copy
<store>
@type elasticsearch
localtime
index_name wwwaccess
hosts es-master-01,es-master-02,es-master-03
#port 9200
logstash_format true
logstash_prefix wwwaccess
flush_interval 3s
</store>
<store>
@type file
path /data/fluentd/www/wwwaccess.log
compress gzip
flush_interval 86400s
</store>
</match>
通过上述配置可以简单的把nginx日志通过fluentd 转发到任意地方存储起来进行查询。
最后在这里说一下为什么采用了fluentd而不是采用logstash或者是flume:
1.fluentd目前开源插件较多(可能没有logstash多但是足够用了),几乎不需要进行二次开发。
2.fluentd相对于其他两者相对较轻,内存占用极低,基本上正则匹配好之后,不需要开发再更改日志格式了。
3.本文由于ltsv格式可以直接被fluentd识别不需要再次正则匹配了,所以我在这里简单的写一个正则来给大家演示一下:
format /^(?<time>[^ ]* [^ ]*) (?<unixtime>[^ ]*)\t(?<host>\[(.*)\])\t(?<level>\[(.*)\])\t(?<category>\[(.*)\])\t(?<unique_id>\[(.*)\])\t(?<message>(.*))$/
这个正则表达式可以简单的把开发日志匹配成kv形式并且性能很好。