Tomcat日志中Session信息的常见类型及解读方法
Tomcat的访问日志(Access Log)默认会记录用户会话的唯一标识Session ID,用于追踪用户的一次会话过程。
server.xml中的AccessLogValve组件设置日志格式,添加%S参数即可输出Session ID。例如:<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %S" />
192.168.1.100 - - [10/Oct/2025:14:30:00 +0800] "GET /app/home HTTP/1.1" 200 1024 ABC123456789DEF
%S对应的ABC123456789DEF即为当前请求的Session ID;Tomcat的运行日志(如catalina.out或localhost.log)会记录Session的生命周期事件(创建、销毁、超时)及异常信息,帮助开发者定位会话相关问题。
conf/logging.properties文件,调整org.apache.catalina.session的日志级别为FINE(详细)或INFO(常规)。例如:org.apache.catalina.session.StandardManager.level = FINE
INFO [main] org.apache.catalina.session.StandardSession tellNew: Created new session with id: XYZ987654321ABC
WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.session.StandardSession expire: Session XYZ987654321ABC expired due to timeout
SEVERE [http-nio-8080-exec-5] org.apache.catalina.session.StandardSession removeAttribute: Session destruction exception: java.lang.NullPointerException
Created new session:表示新会话创建,记录Session ID(如XYZ987654321ABC);expired due to timeout:表示会话因超时失效(需结合web.xml中的session-timeout配置判断是否合理);Session destruction exception:表示会话销毁时发生异常(如代码中未正确释放资源),需重点排查。若需要记录Session中的具体业务属性(如用户ID、角色、购物车内容),可通过访问日志的格式化语法或Servlet代码实现。
%{xxx}s语法输出Session中的属性。例如,记录用户ID(假设Session中属性名为userId):<Valve className="org.apache.catalina.valves.AccessLogValve"
pattern="%h %l %u %t "%r" %s %b %{userId}s" />
日志输出:192.168.1.100 - - [10/Oct/2025:14:35:00 +0800] "GET /app/profile HTTP/1.1" 200 512 1001
(1001为用户ID,从Session中获取)HttpSession session = request.getSession();
String userId = (String) session.getAttribute("userId");
logger.info("User {} accessed profile page", userId);
FINE比INFO更详细);