15

我正在尝试将 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");

没有写入任何文件,也没有创建文件。当我调试代码时,我看到记录器是默认记录器(控制台)。

4

12 回答 12

12

log4j2.xml文件放在src/main/resources. 有用

于 2015-04-01T08:52:22.393 回答
11

实际上这是一个简单的过程。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 个附加程序:一个文件和一个控制台。您可以看到您只需要取消注释已注释的AppenderRef标记即可在文件而不是控制台中获取输出。

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

享受日志记录的乐趣。:-)

于 2014-08-08T04:23:31.187 回答
4

you should put your log4j2.xml into the classpath.

or set "log4j.configurationFile" system property to force to use your log4j2.xml

Please refer to: http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

于 2013-02-06T16:42:45.337 回答
4

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

具体在哪里?对于“在类路径中”的含义,经常会感到困惑。它不能只是在任何地方。它必须位于“顶部”或“默认包”。

src
├── main
│   └── java
│       ├── com
│       │   └── example
│       └── log4j2.xml
于 2013-02-06T16:50:23.757 回答
3

给 Eclipse 用户的提示:

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

长篇大论:

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

  • 此文件的名称未出现在“.classpath”文件中。

  • 我将 log4j2.xml 放在 src/ 目录下。有用。
于 2013-11-09T11:46:46.087 回答
1

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

于 2013-09-13T20:59:31.970 回答
1

我很确定你必须写下你想要记录其消息的类的完整限定名——比如com.application.log4jtest.YourClass. 如果这不起作用,请尝试调整日志级别。

另外 - 就像一个通知 - 你也可以写

Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()
于 2013-02-06T16:36:56.493 回答
1

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

转到 web.xml,并添加此参数:

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>
于 2014-05-19T03:53:24.003 回答
1

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

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

但它不适用于类路径。相反,如果我们将它保存在 src 文件夹中,那么它就可以工作。

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

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

于 2013-10-30T06:26:42.540 回答
0

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

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

并且没有为我创建日志。

使用系统变量-Dlog4j.configurationFile=path/to/log4j2.xml见这里

这解决了我的问题

于 2015-02-26T13:48:10.943 回答
-1

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

于 2013-02-07T13:42:40.973 回答
-1

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

我的解决方案从根 pom.xml 中删除 <packaging>pom</packaging>。打包 pom 会导致 src/main/resources 的内容不会被复制到 target/classes。

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

于 2018-10-16T18:29:21.367 回答