# Tomcat访问日志

# 1. 在tomcat的lib目录中加入4个jar包

  • slf4j-api-1.7.25.jar
  • logback-access-1.2.3.jar
  • logback-classic-1.2.3.jar
  • logback-core-1.2.3.jar

# 2. 在tomcat的conf目录中添加logback-access.xml配置文件。参考内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!-- always a good activate OnConsoleStatusListener -->
	<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%reqAttribute{userId} %t{yyyy-MM-dd HH:mm:ss.SSS} %s %b %D [%i{x-forwarded-for}] "%r"</pattern>
		</encoder>
	</appender>

	<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<File>tomcat-access.log</File>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>history/tomcat-access.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
			<MaxHistory>30</MaxHistory>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
		<!-- appName、appPort、userId的值AccessLogFilter中添加,在此处可以直接通过%reqAttribute方式获取 -->
		<encoder>
			<pattern>%reqAttribute{appName} %reqAttribute{appPort} %reqAttribute{userId} %t{yyyy-MM-ddHH:mm:ss.SSS} %s %b %D [%i{X-Forwarded-For}] "%r"</pattern>
			<charset>UTF-8</charset>
		</encoder>
	</appender>

	<appender-ref ref="ROLLING_FILE" />

</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 3.创建AccessLogFilter.java文件

/**
 * 访问日志处理器。
 *
 * @author leichu
 */
public class AccessLogFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 获取应用名和端口
		String appName = null == request.getContextPath() || request.getContextPath().length() <= 1 ? "" : request.getContextPath().substring(1);
		int appPort = request.getLocalPort();

        // 从session中获取当前用户信息
		CurUser user = CurUserUtil.get(request, request.getSession());
		String userId = null == user ? null : user.getId();
        
        // 写入request
		request.setAttribute("appName", appName);
		request.setAttribute("appPort", appPort);
		request.setAttribute("userId", userId);

		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {

	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# 4.在web.xml中配置上面的Filter

<filter>
    <filter-name>accessLogFilter</filter-name>
    <filter-class>com.leichu.webutil.util.AccessLogFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>accessLogFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

1
2
3
4
5
6
7
8
9
更新时间: 2021-04-28 08:44:23