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

Spring Boot应用在Docker容器中无法生成Tomcat访问日志

Spring Boot Docker容器内Tomcat自定义访问日志无法生成问题

我有一个Spring Boot应用,本地运行时嵌入式Tomcat能正常生成自定义访问日志,但部署到Docker容器后无法生成该日志文件。

自定义日志配置类

@Configuration
public class LoggingConfiguration {

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> connectorCustomizer(final AccessLogProperties accessLogProperties) {
        return tomcat -> {
            final JsonAccessLogValve logValve = new JsonAccessLogValve();
            logValve.setEnabled(accessLogProperties.isEnabled());
            logValve.setBuffered(accessLogProperties.isBuffered());
            logValve.setRenameOnRotate(accessLogProperties.isRenameOnRotate());
            logValve.setRotatable(accessLogProperties.isRotate());
            logValve.setPrefix(accessLogProperties.getPrefix());
            logValve.setSuffix(accessLogProperties.getSuffix());
            logValve.setPattern(accessLogProperties.getPattern());
            tomcat.addContextValves(logValve);
        };
    }
}

日志相关配置(application.yml)

...
    json-access-log:
      enabled: true
      buffered: false
      pattern: "%{yyy-MM-dd'T'hh:mm:ssZ}t %I %l %u %a %r %q %s (%D ms) %{Authorization}i"
      rename-on-rotate: true
      rotate: true
      prefix: chalkup-${ACTIVE_APP_ENVIRONMENT}
      suffix: .access
...

本地运行表现

本地在IntelliJ中运行时,项目根目录下的./logs文件夹会生成chalkup-local.access文件,日志内容正常写入。

Docker相关配置

Dockerfile

FROM eclipse-temurin:21-alpine
ADD ./target/chalkup-*.jar chalkup.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/chalkup.jar"]

Docker Compose配置

chalk-up:
    container_name: chalk-up
    build:
      dockerfile: Dockerfile
      context: .
    environment:
      ACTIVE_APP_ENVIRONMENT: test
    entrypoint:
      - java
      - -agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n
      - -Djava.security.egd=file:/dev/./urandom
      - -jar
      - /chalkup.jar
      - -Dspring.profiles.active=local
    volumes:
      - /tmp/logs:/logs
    ports:
      - "8080:8080"
      - "5005:5005"
    depends_on:
      - wiremock

容器内运行问题

容器启动后,查看容器内/logs目录,仅能看到常规日志文件,自定义的访问日志文件完全缺失。

已尝试的无效解决方案

  • 修改Tomcat的basedir配置为.
  • 调整容器目录读写权限
  • 配置原生Tomcat访问日志(如下),容器内依然无法生成日志:
server:
  tomcat:
    basedir: .
    accesslog:
      enabled: true

临时解决方案

目前通过继承JsonAccessLogValve类并重写log方法,将日志内容直接输出到Slf4j日志中,绕过文件生成问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:19:55