Java 对多个类使用log4j2
我发现了许多帮助我构建记录器的链接。有些在SO中,有些在其他页面中 这里的答案是:这是我找到的最好的答案。 这已经是多年前的想法了,现在有些事情已经不同了 我的目标是在所有java类中共享一个记录器,这些java类将消息打印到日志中,包括控制台和文件。 我正在使用LOG4J2: main():Java 对多个类使用log4j2,java,log4j,Java,Log4j,我发现了许多帮助我构建记录器的链接。有些在SO中,有些在其他页面中 这里的答案是:这是我找到的最好的答案。 这已经是多年前的想法了,现在有些事情已经不同了 我的目标是在所有java类中共享一个记录器,这些java类将消息打印到日志中,包括控制台和文件。 我正在使用LOG4J2: main(): import org.apache.logging.log4j.Logger; public class App { private static final Logger LOGGER = L
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger LOGGER = Logger.getLogger("GLOBAL");
public static void main(){
...calling other classes
}
}
import org.apache.logging.log4j.Logger;
public class secondClass {
private final Logger LOGGER = Logger.getLogger("GLOBAL");
public void writeLog(){
LOGGER.log(Level.INFO, "A simple string");
}
}
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
任何其他类别:
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger LOGGER = Logger.getLogger("GLOBAL");
public static void main(){
...calling other classes
}
}
import org.apache.logging.log4j.Logger;
public class secondClass {
private final Logger LOGGER = Logger.getLogger("GLOBAL");
public void writeLog(){
LOGGER.log(Level.INFO, "A simple string");
}
}
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Properties>
<Property name="basePath">/var/log</Property>
</Properties>
<Appenders>
<RollingFile name="fileLogger" fileName="${basePath}/myApp.log" filePattern="${basePath}/myApp-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="java.util.logging.Logger" level="ALL" additivity="true">
<appender-ref ref="fileLogger" level="ALL" />
</Logger>
<Root level="ALL" additivity="false">
<appender-ref ref="console" />
</Root>
</Loggers>
</Configuration>
或者,在main()中,可能如下所示:
private static Logger LOGGER = null;
@BeforeClass
public static void setLogger() {
System.setProperty("log4j.configurationFile","log4j.xml");
LOGGER = LogManager.getLogger();
}
因为,我相信,使用LogManager,我可以将日志指向xml文件进行设置。
但当我构建并运行它时,CLI会在第一个日志中退出,并在myapp.modules.Database.(Database.java:67)的线程“main”java.lang.NullPointerException中报告:Exception
预期结果:
我所要做的就是能够在我所有的类上有日志记录,并将其写入一个文件。
我就是不能让它工作。当我不使用LogManager时,我只会在控制台上看到日志,而不会创建任何文件。
我同时使用Windows和Linux(这就是为什么/var/log/但我也将其更改为C:\too)
我使用的其他网站:
您在几个级别上都错了:您将JDK的记录器与Log4j2的记录器混用,您没有登录到多个appender,等等
以下是您应该做的:
/pom.xml
4.0.0
com.example
. 对于您的测试,创建一个文件/src/test/resources/log4j2 test.xml
您只需要一个记录器,所以只使用一个:根记录器。您创建了几个,但不需要它们
将附加器添加到记录器(根附加器)
输出
安慰
/var/log/myApp.log
当使用Log4j2时,大多数日志导入应该引用这个包中的类org.apache.logging.log4j
。我想问题就在那里。@neomega抱歉我忘了复制它,我已经在使用它了。Netbeans会在我错过某些东西时警告我。我正在使用import java.util.logging.Logger代码>和POM被编辑为使用log4j api和log4j core->2.10。0@neomega我现在明白你的意思了!我在检查我的错误是否在这里。谢谢在你写之前,我已经把你说的一切都做了!由于我问题下面的评论,我意识到了我的错误。感谢您抽出时间回复!这太好了,我非常感激!您帮助我将log4j.xml重命名为log4j2.xml,因为我完全忘了这么做,这个应用程序之前有log4j 1,2,我正在转换它。无论如何,10分钟后我被困在这里:ERROR StatusLogger找不到log4j2配置文件。使用默认配置:仅将错误记录到控制台。'log4j2.debug'显示log4j2内部初始化日志。
@Nihvel我的项目中没有这个问题。试着从基础开始:将log4j2.xml
文件放在src/main/resources
文件夹中。将其复制为src/test/resources
文件夹中的log4j2 test.xml
,并为要执行的测试编辑该文件。它找不到配置文件。但是文件被重命名,POM也被重命名:src/main/resources${project.build.directory}log4j2.xml
,所以一切都应该很好!我刚打开你的答案。是的,我就是这么做的!好的,我会试着更好地阅读代码!再次感谢!我知道我所拥有的是正确的,但它仍然找不到文件。StackOverflow充满了关于这个主题的问题,他们说的都一样:放入src/main/resources;这就是我所做的。但还是没什么。。。我接受你的回答,因为我问的问题是按照这些指令解决的,但我仍在努力查看属性文件!发现了“问题”。我的POM包含用于使用外部lib/classes/等构建tiny jar文件的指令。。和脂肪罐(一体式,重量约16MB)。第一个是能够读取属性文件并成功写入日志。第二个不是。我必须找到一种让胖jar读取外部属性文件的方法,如下所示:但只是尝试了一下,没有效果。。)该死。
[INFO ] 2017-12-05 16:52:32.218 [main] App - App.main - starting
[INFO ] 2017-12-05 16:52:32.221 [main] SecondClass - SecondClass - starting
[INFO ] 2017-12-05 16:52:32.222 [main] SecondClass - SecondClass - ending
[INFO ] 2017-12-05 16:52:32.222 [main] App - App.main - ending
[INFO ] 2017-12-05 16:52:32.218 [main] App - App.main - starting
[INFO ] 2017-12-05 16:52:32.221 [main] SecondClass - SecondClass - starting
[INFO ] 2017-12-05 16:52:32.222 [main] SecondClass - SecondClass - ending
[INFO ] 2017-12-05 16:52:32.222 [main] App - App.main - ending