初衷
系統(tǒng)中使用lua擴(kuò)展Nginx,實(shí)現(xiàn)Client請求Server的統(tǒng)一接入服務(wù)(鑒權(quán),路由)。
監(jiān)控中心會需要對所有請求數(shù)據(jù)進(jìn)行采集和監(jiān)控,因此需要對nginx的access.log數(shù)據(jù)進(jìn)行采集。
Telegraf Input logParser
telegraf.plugin.inputs.logparser
已經(jīng)實(shí)現(xiàn)了數(shù)據(jù)的采集,使用起來非常方便。
但是存在一個問題,即telegraf.plugin.inputs.logparser
中支持的LOG_FORMAT
只有一種,即COMBINED_LOG_FORMAT
,而我們實(shí)際使用時都會對nginx access.log
的LOG_FORMAT
進(jìn)行自定義;
為了符合自身的數(shù)據(jù)格式進(jìn)行采集,有兩種方式:
第一種,直接配置自定義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
進(jìn)行擴(kuò)展,在源碼中增加patterns,我們這邊因?yàn)榇嬖谧约旱亩_版本,因此選擇了這種方式將自己用到的幾種patterns增加到了源碼中,接下來文章后面主要是該方法的過程。(如果非二開盡量選擇第一種)
獲取源碼
- Install Go
- Setup your GOPATH
- Install FPM
- Run
go get -d github.com/influxdata/telegraf
- Run
cd $GOPATH/src/github.com/influxdata/telegraf
修改源碼擴(kuò)展
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
格式一一對應(yīng)。
LOG_FORMAT
匹配格式,通過正在進(jìn)行匹配:%{IPORHOST:client_ip:tag}
- %{} 為每一個變量
- IPORHOST 正則表達(dá)式變量:logstash-patterns正則
- client_ip 為采集數(shù)據(jù)字段命名,即:
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
#這里因?yàn)椴恍枰虺鏊胁僮飨到y(tǒng)的安裝包,因此使用添加參數(shù)
./scripts/build.py --clean --package --version="1.3.5-custom-1.2" --platform=linux --arch=amd64
或者
默認(rèn)全量打包( ["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