使用log4j2.xml

时间:2018-09-12 16:48:36

标签: java log4j2 slf4j

我想在log4j上使用slf4j。我在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> 

一切正常,没有编译错误或缺少依赖关系,但是我无法在我的类中指定负责Logger初始化的配置(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实例,但它不提供上下文的设置方法。同样,我也找不到从log4j检索LoggerContext的方法。

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

更新 考虑一下我的配置文件(我替换了原始的软件包和附加程序名称):

<?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>

2 个答案:

答案 0 :(得分:0)

从您的问题看来,您要指定 custom 配置位置似乎不对!请参见Automatic Configuration部分in the docs

  

Log4j能够在以下情况下自动配置自身   初始化。 Log4j启动时,它将找到所有   ConfigurationFactory插件,并按加权顺序从   最高到最低。交付时,Log4j包含四个   ConfigurationFactory实现:一种用于JSON,一种用于YAML,一种   用于属性,一个用于XML。

     

Log4j将检查“ log4j.configurationFile”系统属性,并且   如果已设置,将尝试使用   与文件扩展名匹配的ConfigurationFactory。

     
      
  • 如果未设置系统属性,则ConfigurationFactory属性将在类路径中查找log4j2-test.properties。

  •   
  • 如果找不到这样的文件,则YAML ConfigurationFactory将在类路径中查找log4j2-test.yaml或log4j2-test.yml。

  •   
  • 如果未找到此类文件,则JSON ConfigurationFactory将在类路径中查找log4j2-test.json或log4j2-test.jsn。

  •   
  • 如果找不到这样的文件,XML ConfigurationFactory将寻找   类路径中的log4j2-test.xml。

  •   
  • 如果无法找到测试文件,则属性ConfigurationFactory将在类路径中查找log4j2.properties。

  •   
  • 如果找不到属性文件,则YAML ConfigurationFactory将在服务器上查找log4j2.yaml或log4j2.yml。   类路径。

  •   
  • 如果无法找到YAML文件,则JSON ConfigurationFactory将在类路径上查找log4j2.json或log4j2.jsn。

  •   
  • 如果无法找到JSON文件,XML ConfigurationFactory将尝试在类路径上找到log4j2.xml。

  •   
  • 如果找不到配置文件,将使用DefaultConfiguration。这将导致日志记录输出进入控制台。

  •   

您可能在这里想得太多。

您可以通过将其放置在src/main/resources文件夹中或在命令行上使用-cp/-classpath来将其放置在“类路径”上。

答案 1 :(得分:0)

我已经测试了此配置。 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框架添加了Logger。请注意,需要使用jcl-over-slf4j来处理spring的内部日志记录

<?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>