log4j 2 - 配置问题

时间:2013-02-06 16:17:25

标签: java log4j2

我正在尝试配置log4j 2.0来报告日志。

我的配置保存为log4j2.xml,这是它的内容:

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration name="PRODUCTION" status="OFF">

    <appenders>
        <RollingFile name="MyFileAppender" 
            fileName="../Logs/app.log" 
            filePattern="../Logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    </appenders>

    <loggers>
        <root level="trace">
            <appender-ref ref="MyFileAppender"/>
        </root>
    </loggers>

 </configuration>

它存在于项目的类路径中,我尝试将其放在许多其他目录中。

我在代码中创建了一个记录器,如下所示:

    Logger          logger = LogManager.getLogger(MyClass.class.getName());
    logger.info("test");

没有写任何内容,也没有创建文件。 当我调试代码时,我发现记录器是默认的记录器(控制台)。

12 个答案:

答案 0 :(得分:10)

实际上这是一个直接的过程。 Log4j 2的两个主要类如下所示,您需要像这样导入:

    import org.apache.logging.log4j.LogManager
    import org.apache.logging.log4j.Logger

现在使用此代码获取Logger实例。

    private static final Logger logger = LogManager.getLogger();

注意我没有将getLogger()方法的类名指定为参数。 Log4j 2自动计算出来。

现在,您可以使用info(), trace(), debug(), warn(), error(), fatal()类中的任何Logger方法。但要获得所有这些方法的输出,您需要一个XML配置文件。默认情况下,Log4j 2仅生成error() and fatal()方法的输出。

配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <File name="MyCustomLogFile" fileName="/home/me/mylogfile.log">
                <PatternLayout>
                    <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
                </PatternLayout>
            </File>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="all">
                <AppenderRef ref="MyCustomLogFile"/>
                <!--<AppenderRef ref="Console"/>-->
            </Root>
        </Loggers>
    </Configuration>

使用任何名称保存此文件。我使用Log4j2.xml作为名称。现在您需要将此文件放在类路径中,您可以通过在运行程序时传递系统属性来执行此操作,如下所示:

    java -Dlog4j.configurationFile=/path/to/xml/configuration/file/Log4j2.xml MyMainClass

你已经完成了。记录将立即在您的控制台上。

特别说明:

  • 在XML文件中,我提供了2个a​​ppender:一个文件和一个控制台。您可以看到只需要取消注释注释的AppenderRef标记,即可在文件中输出而不是控制台。

  • 您还可以提供环境变量作为系统属性。 Log4j 2将首先从环境变量读取配置文件,然后在-D参数中读取环境变量。

享受日志记录。 : - )

答案 1 :(得分:8)

log4j2.xml文件放在src/main/resources下。它的工作原理

答案 2 :(得分:4)

您应该将log4j2.xml放入类路径中。

或设置“log4j.configurationFile”系统属性强制使用你的log4j2.xml

请参阅:http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

答案 3 :(得分:4)

  

它存在于项目的类路径中,我尝试将其放入   许多其他目录。

到底在哪里?关于“在类路径中”的含义通常存在混淆。它不能只是在任何地方。它必须位于“顶部”或“默认包”。

src
├── main
│   └── java
│       ├── com
│       │   └── example
│       └── log4j2.xml

答案 4 :(得分:2)

eclipse用户的提示:

右键单击该项目,然后单击“刷新”。确保您可以在eclipse中看到log4j2.xml文件。 (这解决了我的问题。)

要详细:

  • 你不应该把文件添加到构建路径。(如果你这样做,eclipse会警告你这个)

  • 此文件的名称未显示在“.classpath”文件中。

  • 我将log4j2.xml放在src /目录下。它有效。

答案 5 :(得分:1)

我非常确定您必须写下要记录其邮件的类的完整限定名称 - 类似com.application.log4jtest.YourClass。如果这不起作用,请尝试摆弄日志级别。

另外 - 只是作为通知 - 你也可以写

Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()

答案 6 :(得分:1)

我有类似的问题。我把文件放在src文件夹下,它工作。我没有在log4j2.xml文件中提到任何包名。

答案 7 :(得分:1)

我有问题,我尝试了一些解决方案,但只有这对我有用:

转到web.xml,然后添加以下参数:

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

答案 8 :(得分:0)

好的,我解决了这个问题。 我必须在xml中指定package =“myPackage”

答案 9 :(得分:0)

在log4j 2的文档中:http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

  

“如果找不到JSON文件,XML ConfigurationFactory将尝试在类路径上找到log4j2.xml。”

但它不适用于classpath。相反,如果我们将它保存在src文件夹中,那么它正在工作。

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

此处提到了类似的问题:https://issues.apache.org/jira/browse/LOG4J2-357

答案 10 :(得分:0)

我也遇到了同样的问题。我将我的log4j2.xml文件保存在系统环境变量中。

变量名称:sys_logroot变量值:D:\ user \ gouse

并且没有为我创建日志。

使用系统变量-Dlog4j.configurationFile=path/to/log4j2.xml See here

这解决了我的问题

答案 11 :(得分:-1)

我有相同的'ERROR StatusLogger No log4j2配置文件。使用默认配置:仅将错误记录到控制台。消息一遍又一遍。这让我发疯。将log4j2.xml文件正确放置在src / main / resources中,就像我之前在数千个项目中所做的一样。

在我的情况下,解决方案是从根pom.xml中删除 pom 。包装pom导致src / main / resources的内容不会复制到目标/类。

为具有相同根本原因的任何人记录日志。