0%

tomcat下各日志文件的说明

  今天同事在使用tomcat发布项目的时候,遇到个问题,导致项目一直无法启动,查看tomcat控制台输出,发现启动日志仅有一句描述:严重: One or more listeners failed to start. Full details will be found in the appropriate container log file,第一时间认为是spring容器初始化失败,那么把spring加载配置文件及初始化的日志级别调整为debug不就万事大吉了么。
  然并卵,日志输出中还是仅有那一句描述,使用tomcat-manager卸载-发布-卸载-发布多个循环,仍无果。
  仔细思考想想,最近查问题都是使用catalina.out以及项目日志来排查,tomcat的其他日志中是不是藏有猫腻。
  最终在localhost.*.log中发现了问题,项目中spring容器扫描package时加载了不同包名但类名相同的bean,导致初始化监听器失败,可是为什么应用的日志组件已经启动,为什么没有报呢?还是翻翻spring、tomcat的源码瞧个仔细吧。
经查阅,spring中contextloadlistener中的异常都是抛出到web容器的,由容器来进行处理,那么就可以定位到tomcat中standardcontext中初始化listener的位置,摘录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (int i = 0; i < instances.length; i++) {
if (!(instances[i] instanceof ServletContextListener))
continue;
ServletContextListener listener =
(ServletContextListener) instances[i];
try {
fireContainerEvent("beforeContextInitialized", listener);
if (noPluggabilityListeners.contains(listener)) {
listener.contextInitialized(tldEvent);
} else {
listener.contextInitialized(event);
}
fireContainerEvent("afterContextInitialized", listener);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
fireContainerEvent("afterContextInitialized", listener);
getLogger().error
(sm.getString("standardContext.listenerStart", instances[i].getClass().getName()), t);
ok = false;
}
}

  好吧,如此可知道日志是通过standardcontext的父类ContainerBase来输出的,顺便瞅一眼tomcat的日志配置,默认为conf/logging.properties,看到该类的日志被输出到location.*.log中,与文首场景中对应上了。
  这么简单的问题查了小半天,惆怅。
  tomcat的相关文档中提示:调用javax.servlet.ServletContext.log(...)输出日志会被tomcat内部日志组件处理,按照日志配置文件中org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}] 的形式被分类记录,那我们顺便了解下tomcat默认的日志配置吧。

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.

4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.

  另外,在conf/server.xml中我们可以开启请求记录日志,那么可以输出五个文件:
1.catalina.yyyy-MM-dd.log Cataline引擎的日志文件,记录启动的JVM参数以及操作系统等信息
2.localhost.yyyy-MM-dd.log tomcat中名为localhost的host日志输出,记录host初始化的日志
3.localhost_access_log.yyyy-MM-dd.txt 记录localhost下各应用的请求
4.host-manager.yyyy-MM-dd.log 记录localhost下host-manager的应用日志
5.manager.yyyy-MM-dd.log 记录localhost下manager的应用日志