Nginx修改日志格式 日志分析 字段分离 ES数据格式的转换及nginx日志参数详解

需求背景:小组内需要做一些日志分析工作,但生产环境的日志不包含请求时间数据,但是直接修改生产配置影响太大,所以只能增加一个nginx日志格式同时产生两种日志并分开存储,之后通过firebeat做字段分离并将其传输到logstash(这里用firebeat传输到logstash的原因是,nginx日志存储生产环境使用的是firebeat,而日志分析的elk部署在另一个AWS区域的非生产环境),最后在logstash当中做类型转换,然后在kibana中展示、分析

软件版本:本次搭建使用的软件都是6.2.4版本
同时本文不详细讲述搭建过程,只说明搭建过程中的几个难点,至于软件安装,百度和官方都有文档说明。

难点1.nginx更换日志格式
直接在nginx配置日志格式,并重启即可,如有旧版本的日志,建议清除或者指定新的日志文件(注:nginx可以指定多分不同格式的日志文件,将其存储在不同的文件即可)

				include     mime.types;    
				default_type  application/octet-stream;         
			    log_format json '{"@timestamp": "$time_iso8601", '
                '"time": "$time_iso8601", '
                '"remote_addr": "$remote_addr", '
                '"AWS_ALB_ip": "$remote_addr", '
                '"remote_user": "$remote_user", '
                '"body_bytes_sent": "$body_bytes_sent", '
                '"request_time": "$request_time", '
                '"upstream_response_time": "$upstream_response_time", '
                '"status": "$status", '
                '"host": "$host", '
                '"request": "$request", '
                '"request_method": "$request_method", '
                '"uri": "$uri", '
                '"http_referrer": "$http_referer", '
                '"size": "$body_bytes_sent", '
                '"user_ip": "$http_x_forwarded_for", '
                '"http_user_agent": "$http_user_agent" '
                '}';
                access_log  /var/log/nginx/access.log  json;

nginx日志字段部分解释:
$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。

难点2:字段分离
由于原始数据全部都在message字段当中,无法对其进行分析,所以要将nginx日志message字段当中的字段全部拆分
方案是通过修改firebeat配置文件,直接进行字段分离,并将分离后的日志打到logstash
字段分离的实现只需将以下代码添加到firebeat配置文件末尾即可

#filebeat.yml需加配置接收json格式日志并解析成Available Fields
#================================ Processors =====================================

# Configure processors to enhance or manipulate events generated by the beat.

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
- decode_json_fields:
    fields: ["message"]    #要进行解析的字段 
    process_array: false   #数组是否解码,默认值:false
    max_depth: 3           #解码深度,默认值:1      target: jsonn          #json内容解析到指定的字段,如果为空(“”),则解析到顶级结构下 
    target: jsonn          #json内容解析到指定的字段,如果为空(“”),则解析到顶级结构下 
    overwrite_keys: false  #如果解析出的json结构中某个字段在原始的event(在filebeat中传输的一条数据为一个event)中也存在,是否覆盖 
    add_error_key: true

难点3:由于要做日志分析,kibana图表的一些聚合参数(例如avg,min)等要求数据要是number格式,这部分可以通过修改ES的配置实现,在本次搭建中,主要处理请求时间数据。下图就是讲message字段做拆分之后的部分新字段。
我这里主要做延迟的分析所以在ES中修改了2个字段的格式jsonn.request_time以及jsonn.upstream_response_time,只需要通过在mutate添加convert 函数转换类型即可
这里有一个注意点:配置文件不能直接写
convert => { “jsonn.request_time” => “float” }
而是要写成convert => { “[jsonn][request_time]” => “float” }
在这里插入图片描述

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}
filter {
#    grok {
#        patterns_dir => ["/data/logstash-6.2.4/pattern"]
#        match => {
#            "message" => ["%{NGINXACCESS}"]
#        }
#
#    }
    if "ELB-HealthChecker" in [message] {
        drop{}
    }
    if "health" in [message] {
        drop{}
    }
    mutate {
      convert => { "[jsonn][request_time]" => "float" }
      convert => { "[jsonn][upstream_response_time]" => "float" }
   
    }

}

最后通过logstash将日志传输到kibana做展示及分析,就可以使用avg,min等聚合函数了
在这里插入图片描述
此外,小编不是大神,也是一边实践一边摸索,在此只是分享自己遇到的一些难题,如果不完善或者不正确、建议欢迎指出(勿喷),希望能够在这个社区获得成长,谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值