1、背景
项目统一入口为nginx,为了直观的统计流量以及响应时间,故打算对nginx日志进行分析
2、思路
采用es ingest node预处理功能,利用pipeline对nginx进行字段拆解,设置模板对字段进行映射,理由kibana或者grafana对映射的字段进行分析
3、实践
es端
1、部署es,kibana(此处不介绍)
2、打开kibana并设置pipeline
pipeline的调试过程
确定nginx的日志格式
log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" '
'$status $body_bytes_sent "$http_x_forwarded_for" '
'$upstream_cache_status $request_time';
确定nginx的日志输出(access)
172.25.36.1 - - [2021-02-07T14:16:47+08:00] "GET /ehc-portal-web/assets/images/user-exhibition/logo-ecard.png HTTP/1.1" 200 857 "-" HIT 0.000
利用kibana tool–>grok debugger进行调试
得出pipeline格式:
%{
IP:clientip} (%{
USERNAME:ident}|-) (%{
USERNAME:auth}|-) \[%{
DATA:timestamp}\] \"%{
WORD:method} %{
URIPATHPARAM:request} HTTP/%{
NUMBER:httpversion}\" %{
NUMBER:Http_Status_Code} %{
NUMBER:bytes} \"(%{
USERNAME:X_Forwarded_For}|-)\" %{
NOTSPACE:cache_status} (%{
NUMBER:Request_Time}|-)
PUT _ingest/pipeline/nginx_access
{
"description" : "my nginx access log pipeline",
"processors": [
{
"grok": {
"field": "message",
"patterns": ["%{IP:clientip} (%{USERNAME:ident}|-) (%{USERNAME:auth}|-) \\[%{DATA:timestamp}\\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:Http_Status_Code} %{NUMBER:bytes} \"(%{USERNAME:X_Forwarded_For}|-)\" %{NOTSPACE:cache_status} (%{NUMBER:Request_Time}|-)"]
}
},
{
"remove": {
"field": ["message", "agent", "ecs", "host", "input", "log"]
}
}
],
"on_failure": [
{
"set": {
"field": "error.message",
"value": "{
{ _ingest.on_failure_message }}"
}
}
]
}
3、设置字段映射(对具体要分析的字段进行特定字段映射)
PUT _template/nginx_access
{
"index_patterns": "nginx_access*",
"mappings" : {
"properties" : {
"request" : {
"type" : "text",
"fields" : {
"keyword" : {
"ignore_above" : 256,
"type" : "keyword"
}
}
},
"agent" : {
"properties" : {
"hostname" : {