nginx日志格式修改
- nginx默认日志格式为文本模式,如下
50.18.254.58 - - [13/Jan/2021:14:13:08 +0800] "GET /live800/OperatorServer?cmd=303&lastMsgTime=1610518374079&tm=1610518386765&loginServerUrl=http%3A%2F%2F50.18.31.25%3A8080%2Flive800&appKey=ODRhMjg3MGE1MTJhYTFlMGM5MTgwM2I0NmYwYjk5NzJBbEljWmhzRDIxNDQ5NjIwNTAxNjFiX2I4OWFfYTU4MDk3elZLaWJyMg%3D%3D&companyID=zycfc&operatorIDEx=98 HTTP/1.1" 200 0 "-" "GoldArmor.Live800.Operator" "50.18.31.25"
- 方便es收集日志可更改为json格式如下:
{ "http_x_forwarded_for": "[]", "remote_addr": "192.168.223.223", "remote_user": "", "time_local": "[13/Jun/2020:02:27:50 +0800]", "request_method": "POST", "request_host": "https://xxx.xxxx.com", "request_host_1": "xxx.xxxx.com", "service_line": "xxx.waf", "request_uri": "/Surney/QrAnswer", "uri": "/Surney/QrAnswer", "query_string": "", "server_protocol": "HTTP/1.1", "status": "200", "body_bytes_sent": "205", "http_referer": "", "http_user_agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23","request_time": "0.040", "upstream_addr": "[192.168.223.114:80]", "req_id": "d3aea77def3a640ca3feb9b75b1f9fe0", "upstream_response_time": "0.031" }
- 修改日志格式需要修改nginx配置文件如下:
log_format main escape=json '{ "http_x_forwarded_for": "[$http_x_forwarded_for]", ' '"remote_addr": "$remote_addr", ' '"remote_user": "$remote_user", ' '"time_local": "[$time_local]", ' '"request_method": "$request_method", ' '"request_host": "$scheme://$host", ' '"request_host_1": "$host", ' '"service_line": "cmp.waf", ' '"request_uri": "$request_uri", ' '"uri": "$uri", ' '"query_string": "$query_string", ' '"server_protocol": "$server_protocol", ' '"status": "$status", ' '"body_bytes_sent": "$body_bytes_sent", ' '"http_referer": "$http_referer", ' '"http_user_agent": "$http_user_agent",' '"request_time": "$request_time", ' '"upstream_addr": "[$upstream_addr]", ' '"req_id": "$request_id", ' '"upstream_response_time": "$upstream_response_time"' ' }';
- 日志参数详解
$http_x_forwarded_for #客户端的真实ip通常web服务器放在反向代理的后面这样就不能获取到客户的IP地址了通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中可以增加x_forwarded_for信息用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
$remote_addr # 远程客户端的IP地址
$remote_user #远程客户端用户名称用于记录浏览者进行身份验证时提供的名字如果没有登录就是空白。
$time_local #访问的时间与时区比如18/Jul/2012:17:00:01 +0800时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request_method #HTTP请求方法,通常为"GET"或"POST"
$scheme #请求使用的Web协议,"http" 或 "https"
$host #HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写
$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"
$query_string #请求中的参数值
$server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status #HTTP响应代码
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$http_referer #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent #用户终端浏览器等信息
$request_time #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$upstream_addr #真正提供服务的主机地址
$request_id #生产唯一ID方便查询问题
$upstream_response_time #请求过程中upstream的响应时间