共计 1082 个字符,预计需要花费 3 分钟才能阅读完成。
前言
使用 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);
(可能写的有点抽象啊,只是为了自己记录一下,不要忘记)