【问题标题】:log4j 2 - configuration issuelog4j 2 - 配置问题
【发布时间】:2013-02-06 16:17:24
【问题描述】:

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

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

【问题讨论】:

    标签: java log4j2


    【解决方案1】:

    log4j2.xml 文件放在src/main/resources 下。有效

    【讨论】:

    • 这是否添加了其他 9 个答案中未涵盖的任何内容?
    • 是的,这给出了放置 log4j2.xml 文件的确切位置。
    • 非常感谢,为我工作
    【解决方案2】:

    实际上这是一个简单的过程。 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 会自动计算出来。

    现在您可以使用Logger 类中的任何info(), trace(), debug(), warn(), error(), fatal() 方法。但是要获得所有这些方法的输出,您需要一个 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 参数中读取。

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

    【讨论】:

      【解决方案3】:

      给 Eclipse 用户的提示:

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

      详细一点:

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

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

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

      【讨论】:

      • 我将 log4j2.xml 放在 src/ 目录下。有用。谢谢!
      【解决方案4】:

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

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

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

      【讨论】:

      • 嗨,我正在使用 netbeans,类路径如下: ProjectName\build\classes\ProjectName\log4j2.xml 日志 xml 位于所有其他 .class 文件的目录中。我可以看到它是类路径,因为它写在项目属性中: -build.classes.dir=${build.dir}/classes
      • 在标准 maven 模块设置中为我工作,谢谢。
      • @wolfcastle log4j2.xml 我的eclipse项目中的文件位于src文件夹下,但是log4j仍然无法检测到它。有什么建议吗?
      【解决方案5】:

      在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

      【讨论】:

        【解决方案6】:

        你应该把你的 log4j2.xml 放到类路径中。

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

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

        【讨论】:

        • 是的,我读到了,我确实把它放在那里(至少我是这么认为的)。请阅读我写给 wolfcastle 的评论。谢谢
        • 遗憾的是,这两条规则在很多(简单)案例中还不够
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 您的意思是packages 作为configuration 根元素的属性吗?像这样&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;configuration name="myproject" packages="my.package" monitorInterval="30"&gt;&lt;!-- ... --&gt;&lt;/configuration&gt;
            【解决方案10】:

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

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

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

            【讨论】:

            • 试过了..还是没有。它必须与类路径有关..但我不知道是什么。
            【解决方案11】:

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

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

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

            【讨论】:

              【解决方案12】:

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

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

              没有为我创建日志。

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

              这解决了我的问题

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-12-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-06-09
                • 2013-05-18
                相关资源
                最近更新 更多