使用 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">
等)。
我在 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">
等)。