使用 Logback catalina.out

Using Logback to catalina.out

我在 Tomcat 的应用程序 运行 中使用 Logback。当我的应用程序运行时,在调试器中,我看到我的日志语句已到达,但这些语句永远不会到达 /opt/tomcat/logs/catalina.out。 (顺便说一句,我确实在 IntelliJ IDEA 调试器控制台中看到了这些语句,但是在部署时,它们没有达到 catalina.out。)我从哪里开始?

在我的 WAR 中,WEB-INF/classes/logback。xml 看起来像这样:

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/catalina.out</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <maxFileSize>10MB</maxFileSize>
      <maxHistory>10</maxHistory>
    </rollingPolicy>
    <immediateFlush>true</immediateFlush>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%date %level [%thread] %logger{40} %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="FILE" />
  </root>
</configuration>

在代码中,我这样做例如:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Validator
{
  private static final Logger logger = LoggerFactory.getLogger( Validator.class );
  ...

  public void foo()
  {
    logger.info( "Called foo()" );

相应地,在pom.xml依赖项中,我有这个:

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>${logback-version}</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-access</artifactId>
  <version>${logback-version}</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>${slf4j.version}</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>${slf4j.version}</version>
</dependency>

我也在 logback.xml 中尝试过这个。它没有创建文件。所有日志文件都归 tomcat:tomcat 所有。 Tomcat 拥有写入日志的线程。

<file>${catalina.base}/logs/test.log</file>

问题原来是 slf4j JAR 和多个绑定。参见

https://www.slf4j.org/codes.html#multiple_bindings.

我从依赖项中删除了 slf4j-simple,如上所示。两个 slf4j JAR 发生冲突的事实本质上禁止 logback.xml 对日志记录行为产生任何影响。修复此问题后,JUnit 测试仍然有效,当 IDE-embedded Tomcat 级别设置为 TRACE 时,IDE-embedded Tomcat 开始显示 TRACE 级别的语句,部署到真实 Tomcat 出现语句的安装(在我的例子中是 catalina.out)。

我可以做的另一个观察是,如果进行 log-level 配置更改(例如,直接在路径 logback.xml 上手动更改 /opt/tomcat/webapps/application/WEB-INF/classes/logback.xml), 我发现 Tomcat 必须被反弹才能生效(即使我玩 <configuration scan="true">等)。