Apache TomEE 8配置访问日志输出至控制台失效问题排查
TomEE 8 迁移Kubernetes:访问日志无法输出到控制台排查
我们基于TomEE 8运行Java应用,迁移到Kubernetes部署时需要将访问日志输出至控制台,已配置server.xml和conf/logging.properties但访问日志仍未输出,配置详情如下:
server.xml 配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/dev/stdout" prefix="" suffix="" pattern="%h %{NSC-Client-IP}i %l %u %t "%r" %s %b %D %F %I" rotatable="false" conditionIf="false" conditionUnless="false" enabled="true" asyncSupported="true"> </Valve>
logging.properties 配置
handlers = 1catalina.java.util.logging.ConsoleHandler, \ 2localhost.java.util.logging.ConsoleHandler, \ 3manager.java.util.logging.ConsoleHandler, \ 4host-manager.java.util.logging.ConsoleHandler .handlers = 1catalina.java.util.logging.ConsoleHandler ############################################################ # console Handler specific properties. # Describes specific configuration info for Handlers. ############################################################ 1catalina.java.util.logging.ConsoleHandler.level = INFO 1catalina.java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 1catalina.java.util.logging.SimpleFormatter.format=[%1$tc] [:Catalina:] %4$s %3$s %5$s %n 1catalina.java.util.logging.ConsoleHandler.encoding = UTF-8 2localhost.java.util.logging.ConsoleHandler.level = INFO 2localhost.java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 2localhost.java.util.logging.SimpleFormatter.format=[%1$tc] [:localhost:] %4$s %3$s %5$s %n 2localhost.java.util.logging.ConsoleHandler.encoding = UTF-8 3manager.java.util.logging.ConsoleHandler.level = INFO 3manager.java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 3manager.java.util.logging.SimpleFormatter.format=[%1$tc] [:manager:] %4$s %3$s %5$s %n 3manager.java.util.logging.ConsoleHandler.encoding = UTF-8 4host-manager.java.util.logging.ConsoleHandler.level = INFO 4host-manager.java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 4host-manager.java.util.logging.SimpleFormatter.format= [%1$tc] [:host-manager:] %4$s %3$s %5$s %n 4host-manager.java.util.logging.ConsoleHandler.encoding = UTF-8 ############################################################ # Facility specific properties. # Provides extra control for each logger. ############################################################ org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.java.util.logging.ConsoleHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.java.util.logging.ConsoleHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.java.util.logging.ConsoleHandler # For example, set the org.apache.catalina.util.LifecycleBase logger to log # each component that extends LifecycleBase changing state: #org.apache.catalina.util.LifecycleBase.level = FINE # To see debug messages in TldLocationsCache, uncomment the following line: #org.apache.jasper.compiler.TldLocationsCache.level = FINE # To see debug messages for HTTP/2 handling, uncomment the following line: #org.apache.coyote.http2.level = FINE # To see debug messages for WebSocket handling, uncomment the following line: #org.apache.tomcat.websocket.level = FINE
排查与解决步骤
1. 修复AccessLogValve的条件配置
当前设置的conditionIf="false"和conditionUnless="false"会导致Valve永远不会触发日志记录:
conditionIf:仅当表达式为true时记录日志conditionUnless:仅当表达式为false时记录日志
两者同时设为false,所有请求都不满足日志输出条件。
修改方案:删除这两个条件配置,或根据需求调整为合理表达式(比如保留空的conditionUnless=""表示无限制)。修改后的Valve配置如下:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/dev/stdout" prefix="" suffix="" pattern="%h %{NSC-Client-IP}i %l %u %t "%r" %s %b %D %F %I" rotatable="false" enabled="true" asyncSupported="true"> </Valve>
2. 验证/dev/stdout的可写权限
在Kubernetes容器内执行以下命令,检查TomEE进程是否有权限写入/dev/stdout:
touch /dev/stdout && echo "test" > /dev/stdout
如果执行失败,需调整容器运行用户或安全上下文,确保进程拥有写入权限。
3. 确认TomEE加载的是目标server.xml
查看TomEE启动日志,确认加载的配置文件路径是否为你修改的文件。启动日志会输出类似Loading server configuration from [/path/to/server.xml]的内容,若路径不符,需检查TomEE的配置加载逻辑或挂载路径。
4. 检查全局日志级别是否过滤访问日志
虽然AccessLogValve不受logging.properties直接控制,但如果全局日志级别设置过高,可能会抑制输出。确认logging.properties中无全局级别限制(比如.level未设为高于INFO的级别)。
5. 可选:替换为AsyncAccessLogValve优化性能
针对Kubernetes场景,AsyncAccessLogValve性能更优,且支持输出到/dev/stdout,可尝试替换Valve类:
<Valve className="org.apache.catalina.valves.AsyncAccessLogValve" directory="/dev/stdout" prefix="" suffix="" pattern="%h %{NSC-Client-IP}i %l %u %t "%r" %s %b %D %F %I" rotatable="false" enabled="true"> </Valve>
内容的提问来源于stack exchange,提问作者SUMIT
相关产品推荐
相关产品推荐

