当前位置: 首页 > 知识库问答 >
问题:

使用log4j2.xml初始化slf4j

魏誉
2023-03-14

我想使用slf4j而不是Log4J。我在我的pom.xml中添加了以下依赖项(我对slf4j使用了1.7.25,对log4j2使用了2.10.0):

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>


    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-slf4j-impl</artifactId>
       <version>${log4j.version}</version>
    </dependency>

    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>${log4j.version}</version>
    </dependency>

    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>${log4j.version}</version>
    </dependency>
</dependencies> 

一切都构建得很好,没有编译错误或缺乏依赖,但我未能在类中指定负责日志程序初始化的配置(log4j2.xml)文件。在这种情况下,它总是打印相同的警告

log4j:WARN No appenders could be found for logger (com.mypackage.etc).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我搜索了一种提供配置文件的适当方法,结果是:

LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
File file = new File("path/to/a/different/log4j2.xml");
context.setConfigLocation(file.toURI());

问题是,在我的例子中,LogManager.getContext(false)将始终返回Slf4JLoggerContext的实例(考虑到我使用slf4j作为记录器的门面),并且初始化将失败,出现ClassCastException。我试图存储Slf4JLoggerContext的实例,但它没有提供上下文的setter。另外,我没有找到从log4j检索LoggerContext的方法。

有没有什么方法可以将配置文件(log4j2.xml)提供给slf4j,以便看到所有的附加程序和记录器?

更新考虑这个我的配置文件(我替换了原来的包和附件名称):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="def.files.backup.count">10</Property>
        <Property name="log.file.path">${oo.home}/var/logs</Property>
        <Property name="def.file.max.size">10MB</Property>
        <Property name="log.level">WARN</Property>
    </Properties>

    <ThresholdFilter/>

    <Appenders>
        <RollingFile name="Appender1" fileName="${log.file.path}/file1.log" maxFileSize="${def.file.max.size}"
                     maxBackupIndex="${def.files.backup.count}">
            <PatternLayout>org.apache.log4j.PatternLayout</PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="Appender2" fileName="${log.file.path}/file2.log"
                     maxFileSize="${def.file.max.size}"
                     maxBackupIndex="${def.files.backup.count}">
            <PatternLayout>org.apache.log4j.PatternLayout</PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="Appender3" fileName="${log.file.path}/file3.log"
                     maxFileSize="${def.file.max.size}"
                     maxBackupIndex="${def.files.backup.count}">
            <PatternLayout>org.apache.log4j.PatternLayout</PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
        </RollingFile>

    </Appenders>

    <Loggers>
        <AsyncLogger name="com.package1.oo" level="${log.level}" additivity="false">
            <AppenderRef ref="Appender1"/>
        </AsyncLogger>

        <AsyncLogger name="io.package2" level="${log.level}" additivity="false">
            <AppenderRef ref="Appender2"/>
        </AsyncLogger>

        <AsyncLogger name="com.package3.package3" level="${log.level}" additivity="false">
            <AppenderRef ref="Appender3"/>
        </AsyncLogger>

        <AsyncLogger name="org.package4" level="${log.level}">

        </AsyncLogger>

        <AsyncLogger name="com.package5.Class1" level="${log.level}">

        </AsyncLogger>

        <AsyncRoot level="${log.level}">
            <AppenderRef ref="Appender1"/>
            <AppenderRef ref="Appender2"/>
            <AppenderRef ref="Appender3"/>

        </AsyncRoot>
    </Loggers>

</Configuration>

共有1个答案

梁丘赞
2023-03-14

我已经测试了这个配置。log4j2文件必须在您的类路径中。

Maven

<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
    </dependency>

log4j2.xml

此外,添加xsd有助于创建配置。我已经为spring Framework添加了Logger。注意,使用Spring的内部日志记录需要jcl-over-slf4j

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error"
               xmlns="http://logging.apache.org/log4j/2.0/config"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://logging.apache.org/log4j/2.0/config
                https://raw.githubusercontent.com/apache/logging-log4j2/master/log4j-core/src/main/resources/Log4j-config.xsd">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="org.springframework" level="error">
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>
 类似资料:
  • 我想使用新的log4j2-Java日志框架。一切正常,但我从一小时后就尝试加载一个自定义配置文件来配置日志记录(如日志级别)。 这是我的log4j2.xml: 我尝试了以下方法,但没有任何效果: 移动log4j2.xml文件,使其位于默认包中。 将log4j2.xml文件移动到项目中的任意位置 将log4j2.xml文件命名为log4j.xml 在项目中创建一个文件夹,将log4j2.xml文件放

  • 我正在尝试设置Application子类中的默认FirebaseApp: 看起来一切正常,但当我想将一些事件记录到FirebaseAnalytics时,我会得到这个错误:缺少Google_App_ID。已禁用Firebase分析。我不知道问题出在哪里。

  • 你已经有了基本的页面布局和需要用的CSS以及JS文件。现在我们需要初始化我们的应用,比如在 my-app.js中 var myApp = new Framework7(); 上面这个例子中我们使用了 myApp 作为变量名存储 Framework7 初始化之后的实例。 这样初始化非常简单,但是Framework7 也提供了更多个性化的定制,只需要在初始化的时候传入一个配置对象即可。 var myA

  • 问题内容: 我想知道如何初始化数据库而不必创建XML文件。 我已经使用了这种可以正常工作的初始化,但是在当前情况下,我不想创建XML: 我知道我可以使用以下方法创建嵌入式数据库: 就我而言,数据库和架构是使用Liquibase创建的。 我只想用Spring和我的自定义数据集来初始化它,而不必每次都为此创建一个新的XML文件。 可能吗? 问题答案: 在查看与EmbeddedDatabaseBuild

  • 我在使用Mockito进行单元测试初始化对象时遇到了一些困难 这是我的测试代码 要测试的代码 RecTangleService、CircleService和SquareService用注释我尝试了很多选项,最终得出结论。我没有得到我错在哪里。我试着在网上搜索了很多地方,但找不到任何帮助。

  • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a