You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %s %b %D %F %I"
        rotatable="false"
        enabled="true">
</Valve>

内容的提问来源于stack exchange,提问作者SUMIT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:23:20