我正在尝试配置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");
没有写任何内容,也没有创建文件。 当我调试代码时,我发现记录器是默认的记录器(控制台)。
答案 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个appender:一个文件和一个控制台。您可以看到只需要取消注释注释的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”文件中。
答案 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>
答案 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中删除
为具有相同根本原因的任何人记录日志。