Spring + Logback(slf4j) 日志没有 jcl-over-slf4j

Roc*_*oom 5 java logging spring logback maven

如果我通过添加这样的 maven 依赖项将 Logback 和 Slf4j 添加到我的 Spring MVC(版本 4.1.0)项目中:

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
                <version>1.7.21</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.21</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.1.7</version>
                <scope>runtime</scope>
            </dependency>
Run Code Online (Sandbox Code Playgroud)

并排除 commons-logging 依赖项,然后我进入日志文件,除了应用程序日志之外,还有一些 spring 事件信息级别,例如:

[RMI TCP Connection(4)-127.0.0.1][org.springframework.web.context.ContextLoader] - Root WebApplicationContext: initialization started
Run Code Online (Sandbox Code Playgroud)

如果我在没有 jcl-over-slf4j 的情况下添加依赖项,并且没有在 pom.xml 中排除 commons-logging,那么我只会得到应用程序日志。

这是我的 logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="LOG_HOME" value="logs" />
    <property name="APP_NAME" value="App" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %logger{50} - %msg%n</pattern>            
        </encoder>
    </appender>

    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>

        <encoder>
            <charset>UTF-8</charset>
            <pattern>%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %logger{50} - %msg%n</pattern>                
        </encoder>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>  

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

    <logger name="org.springframework" level="INFO" appender-ref="FILE"/>
</configuration>
Run Code Online (Sandbox Code Playgroud)

据我了解,发生这种情况是因为当我不使用 JCL-bridge 时,logback 无法捕获或翻译 JCL spring 内部日志。请纠正我,如果我错了。

我可以配置 logback.xml 以在没有 JCL-bridge 的情况下获取标准 spring 日志事件吗?

Hra*_*sch 4

检查他们的文档,因为它是一个很好的信息来源,有很多示例。\n回到你的问题:\nSpring 和 JCL:

\n
\n

Spring 中的强制日志记录依赖项是 Jakarta Commons\nLogging API (JCL)。我们针对 JCL 进行编译,并且还使 JCL Log\n对象对于扩展 Spring 框架的类可见。\xe2\x80\x99s\n对于用户来说很重要的是,所有版本的 Spring 都使用相同的日志记录\n库:迁移很容易,因为即使对于扩展 Spring 的应用程序,\n也保留了向后兼容性。我们这样做的方式\n是为了使之一Spring 中的模块显式依赖于commons-logging(JCL 的规范实现),然后让所有其他模块在编译时都依赖于它。例如,如果您正在使用 Maven,并且想知道从哪里获得了对 commons-logging 的依赖,那么它来自 Spring,特别是来自名为 spring-core 的中央模块。

\n
\n

Logback 配置,这里有一点很好:

\n
\n

SLF4J 用户中更常见的选择是直接绑定到 Logback,它使用更少的步骤并生成更少的依赖项。这\n删除了额外的绑定步骤,因为Logback 直接实现了 SLF4J\n,因此您只需要依赖两个库而不是四个\n(jcl-over-slf4j 和 logback)。如果您这样做,您可能还需要从其他外部依赖项(不是 Spring)中排除 slf4j-api 依赖项,因为您只需要在类路径上使用该 API 的一个版本。

\n
\n