初衷
系统中使用lua扩展Nginx,实现Client请求Server的统一接入服务(鉴权,路由)。
监控中心会需要对所有请求数据进行采集和监控,因此需要对nginx的access.log数据进行采集。
Telegraf Input logParser
github 地址
telegraf.plugin.inputs.logparser
已经实现了数据的采集,使用起来非常方便。
但是存在一个问题,即telegraf.plugin.inputs.logparser
中支持的LOG_FORMAT
只有一种,即COMBINED_LOG_FORMAT
,而我们实际使用时都会对nginx access.log
的LOG_FORMAT
进行自定义;
为了符合自身的数据格式进行采集,有两种方式:
第一种,直接配置自定义patterns,见配置:
...
## Custom patterns can also be defined here. Put one pattern per line.
custom_patterns = '''
'''
...
范例:
[[inputs.logparser]]
[inputs.logparser.grok]
patterns = ["%{TS_UNIX:timestamp:ts-unix} value=%{NUMBER:value:int}"]
custom_patterns = '''
TS_UNIX %{DAY} %{MONTH} %{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND} %{TZ} %{YEAR}
'''
第二种,需要对telegraf.plugin.inputs.logparser.grok
进行扩展,在源码中增加patterns,我们这边因为存在自己的二开版本,因此选择了这种方式将自己用到的几种patterns增加到了源码中,接下来文章后面主要是该方法的过程。(如果非二开尽量选择第一种)
获取源码
- Install Go
- Setup your GOPATH
- Install FPM
- Run
go get -d github.com/influxdata/telegraf
- Run
cd $GOPATH/src/github.com/influxdata/telegraf
修改源码扩展
1. 修改代码 telegraf/plugins/inputs/logparser/grok/influx_patterns.go
const DEFAULT_PATTERNS = `
COMMON_LOG_FORMAT %{CLIENT:client_ip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:ts:ts-httpd}\] "(?:%{WORD:verb:tag} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version:float})?|%{DATA})" %{NUMBER:resp_code:tag} (?:%{NUMBER:resp_bytes:int}|-)
COMBINED_LOG_FORMAT %{COMMON_LOG_FORMAT} %{QS:referrer} %{QS:agent}
自定义
`
源码中定义了常量DEFAULT_PATTERNS
,需要在这里自定义
自己的LOG_FORMAT
,通过空格隔开来和自己的access.log中LOG_FORMAT
格式一一对应。
LOG_FORMAT
匹配格式,通过正在进行匹配:%{IPORHOST:client_ip:tag}
- %{} 为每一个变量
- IPORHOST 正则表达式变量:logstash-patterns正则
- client_ip 为采集数据字段命名,即:
Metric.tag:{client_ip:127.0.0.1}
- tag 范围取值范围如下,需要注意的是,
tag
是可以将字段存放在Metric.tag:{client_ip:127.0.0.1}
中,其余都在Metric.fields:{client_ip:127.0.0.1}
- tag
# Available modifiers:
# string (default if nothing is specified)
# int
# float
# duration (ie, 5.23ms gets converted to int nanoseconds)
# tag (converts the field into a tag)
# drop (drops the field completely)
# Timestamp modifiers:
# ts-ansic ("Mon Jan _2 15:04:05 2006")
# ts-unix ("Mon Jan _2 15:04:05 MST 2006")
# ts-ruby ("Mon Jan 02 15:04:05 -0700 2006")
# ts-rfc822 ("02 Jan 06 15:04 MST")
# ts-rfc822z ("02 Jan 06 15:04 -0700")
# ts-rfc850 ("Monday, 02-Jan-06 15:04:05 MST")
# ts-rfc1123 ("Mon, 02 Jan 2006 15:04:05 MST")
# ts-rfc1123z ("Mon, 02 Jan 2006 15:04:05 -0700")
# ts-rfc3339 ("2006-01-02T15:04:05Z07:00")
# ts-rfc3339nano ("2006-01-02T15:04:05.999999999Z07:00")
# ts-httpd ("02/Jan/2006:15:04:05 -0700")
# ts-epoch (seconds since unix epoch)
# ts-epochnano (nanoseconds since unix epoch)
# ts-"CUSTOM"
2. 修改配置
- 修改配置文件:
telegraf/etc/telegraf.conf
- 找到
[inputs.logparser.grok]
的配置,在注释中加入自定义的格式化变量名,方便配置时使用,例如:
telegraf.conf
... ...
# ## %{COMMON_LOG_FORMAT} (plain apache & nginx access logs)
# ## %{COMBINED_LOG_FORMAT} (access logs + referrer & agent)
# ## ${CUSTOM_LOG_FORMAT} (自定义LOG_FORMAT)
... ...
重新打包 telegraf
- Install FPM
- Run
#这里因为不需要打出所有操作系统的安装包,因此使用添加参数
./scripts/build.py --clean --package --version="1.3.5-custom-1.2" --platform=linux --arch=amd64
或者
默认全量打包( ["amd64", "i386", "armhf", "armel", "arm64", "static_amd64"],[ "deb", "rpm", "tar" ])
make package
获得新的安装包
- 路径:
build/telegraf-1.3.5-xx-1.2~7192e68_linux_amd64.tar.gz