Nginx-日志自定义记录及启用日志缓冲区

原文链接: 何晓东 博客 如果想统计网站的访问来源信息,可以用 php 获取信息,记录到数据库的形式,也可以直接使用 nginx 提供的访问日志,来记录网站的访问详情,管理员可以通过分析 nginx 的访问日志,来分析用户的访问来源,访问行为详情,网站页面访问热度等。此外,nginx 自身也有错误日志,方便运维人员调试 nginx。对于记录日志的行为,如果每次进行磁盘操作,将会较多的耗费资源,基于这个情况可以开启 nginx 日志缓冲区,缓冲区满或者定时写入的时间到了,再一次写入日志。访问日志nginx 在处理请求后立即在访问日志中写入有关客户端请求的信息。默认情况下,访问日志位 logs/access.log 中,信息以预定义的组合格式写入日志。想要精确记录访问信息,就需要自定义一个更加完整的访问日志格式,如下所示: http { log_format geoproxy '[$time_local] $remote_addr ' '$realip_remote_addr $remote_user ' '$request_method $server_protocol ' '$scheme $server_name $uri $status ' '$request_time $body_bytes_sent ' '$geoip_city_country_code3 $geoip_region ' '"$geoip_city" $http_x_forwarded_for ' '$upstream_status $upstream_response_time ' '"$http_referer" "$http_user_agent"'; ...}这个日志配置被命名为 geoproxy,它使用许多 nginx 变量来演示 nginx 日志记录功能。详细讲解配置选项中各个变量的具体含义:当用户发起请求时,会记录服务器时间 $time_local, $remote_user 值为通过基本授权的用户名称;用于 nginx 处理 geoip_proxy 和 realip_header 指令的打开连接的 IP 地址和客户端 IP 地址;之后记录 HTTP 请求方法 $request_method、协议 $server_protocol 和 HTTP 方法 $scheme:http 或 https;当然还有服务器名称 $server_name、请求的 URI 和响应状态码;除基本信息外,还有一些统计的结果数据:包括请求处理的毫秒级时间 $request_time、服务器响应的数据块大小 $body_bytes_sent;此外,客户端所在国家 $geoip_city_country_code3、地区 $geoip_region 和城市信息 $geoip_city 也被记录在内;变量 $http_x_forwarded_for 用于记录由其它代理服务器发起的请求的 X-Forwarded-For 头消息;upstream 模块中一些数据也被记录到日志里:被代理服务器的响应状态码 $upstream_status 、建立链接和从上游服务器接收响应主体最后一个字节的时间 $upstream_response_time、 建立和上游服务器的链接时间 $upstream_connect_time、建立链接和从上游响应头的第一个字节的时间 $upstream_header_time。 请求来源 $http_referer 和用户代理 $http_user_agent 也可以被记录在日志里;nginx 的日志记录功能非常强大和灵活的,需要注意的是:用于定义日志格式的 log_format 指令仅适用于 http 块级指令内,所有时间值均以毫秒为单位,以毫秒分辨率进行测量。。 ...

June 10, 2019 · 2 min · jiezi

spring-boot的access日志格式修改

前言使用spring-boot框架开发的项目中,默认的logback格式可能默认是如下的格式:<Valve className=“org.apache.catalina.valves.AccessLogValve” directory=“logs” prefix=“access.” suffix=".log" pattern="%h %l %u %t “%r” %s %b “%{Referer}i” “%{User-Agent}i” %{X-Forwarded-For}i “%Dms”" resolveHosts=“false”/>假设有一种场景,我们希望能够将业务数据加入到access日志中,方便统计每个接口在用户粒度的调用量。那么在分布式日志服务中,我们可以考虑在每行的access日志中,添加用户的id,方便直接解析到es中,在es中计算count即可。本文主要解决access日志中添加userId的问题。具体思路tomcat的access日志配置介绍可以参考博文:【Tomcat Access Log配置】在上述博文中,我们可以看到如下内容:Access Log中也支持cookie,请求header,响应headers,Session或者其他在ServletRequest中的对象的信息。格式遵循apache语法%{xxx}i 请求headers的信息%{xxx}o 响应headers的信息%{xxx}c 请求cookie的信息%{xxx}r xxx是ServletRequest的一个属性%{xxx}s xxx是HttpSession的一个属性我们发现是可以给ServletRequest添加属性,打印日志的时候进行解析的。不过使用上述的格式配置的logback-access.xml文件因为格式问题导致无法解析。找到一篇详解logback layout配置的文章:https://blog.csdn.net/Doraemo…可以看到需要使用%reqAttribute{XXXX}才可以。<pattern>%i{ClientIp} %h %l %u [%t] “%r” %s %b “%i{Referer}” “%i{User-Agent}” %i{x-ssl-header} %reqAttribute{user-id}%n======%n%fullRequest%n======%n%fullResponse</pattern>只需要在代码中进行如下设置即可servletRequest.setAttribute(“user-id”, userId);(可能写的有点抽象啊,只是为了自己记录一下,不要忘记)

February 27, 2019 · 1 min · jiezi