Tomcat JULI logging.properties配置疑问确认及.handlers规则咨询
Tomcat JULI 配置疑问解答
先聊聊你标注的*开头配置行的理解
兄弟,虽然你没把具体标注的配置行贴出来,但根据我平时帮人排查JULI配置的经验,咱们常见的几个理解点大概率是准确的:
- 比如像
*.level = INFO这种根日志器级别配置,你要是理解成「全局默认日志级别是INFO,没单独设级别的子日志器都会继承这个」——完全正确; - 要是你标注
1catalina.org.apache.juli.FileHandler.level = FINE,说「这个文件处理器自己的过滤级别是FINE,只有日志级别≥FINE的消息才会被它记录」——没错,处理器的级别和日志器的级别是分开的,要同时满足两者的级别要求才会输出; - 要是你对
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE的理解是「给localhost容器对应的日志器单独设了FINE级别」——这也没毛病,Tomcat就是通过这种命名空间的方式给不同组件的日志器做精细配置的。
如果你的标注行是其他特殊情况,随时补充细节我再帮你核对~
关于.handlers配置的困惑,我给你掰扯清楚
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler这行是根日志器的处理器配置,JULI继承了JUL的日志继承机制,这里的逻辑得理明白:
- 要是一个子日志器没自己声明handlers,它会乖乖继承父日志器(最终到根)的处理器;
- 要是子日志器已经声明了自己的handlers,默认情况下(
useParentHandlers默认是true),它会同时用自己的处理器+根日志器的这两个处理器; - 但如果这个子日志器设置了
useParentHandlers = false,那它就只认自己的处理器,根的那两个就不会生效了。
举个实际例子:假设你给org.apache.catalina.core.ContainerBase.[Catalina].[localhost]设了handlers = 2localhost.org.apache.juli.FileHandler,没改useParentHandlers,那这个日志器的消息会同时写到localhost.log和根处理器对应的catalina.log、控制台;要是你加了org.apache.catalina.core.ContainerBase.[Catalina].[localhost].useParentHandlers = false,那消息就只写到localhost.log里了。
再说说日志跑到2localhost.org.apache.juli.FileHandler的事儿
这个处理器是Tomcat专门给localhost相关日志准备的,对应咱们平时看的localhost.log文件。它的生效逻辑是这样的:
- Tomcat会在
logging.properties里给org.apache.catalina.core.ContainerBase.[Catalina].[localhost]这个日志器配置handlers = 2localhost.org.apache.juli.FileHandler; - 当localhost容器自身,或者部署在localhost下的Web应用产生日志时,对应的日志器就会把消息发给这个专属处理器;
- 同时,这个处理器的输出目录、文件名前缀、日志级别、格式这些,都是通过
2localhost.org.apache.juli.FileHandler.directory、2localhost.org.apache.juli.FileHandler.prefix这类配置项单独定义的,目的就是把localhost相关的日志和catalina的主日志分开,方便咱们排查问题的时候找起来更顺。
内容的提问来源于stack exchange,提问作者shodz
相关产品推荐
相关产品推荐

