[英]Use log4j2 for multiple classes
我發現許多鏈接可以幫助我構建記錄器。 一些在SO中,其他在其他頁面中。
這個答案在這里: https : //stackoverflow.com/questions/7624895/how-to-use-log4j-with-multiple-classes# =是我發現的最好的。 已經有幾年的歷史了,現在有些事情有所不同了。
我的目標是在所有將消息打印到日志(包括控制台和文件)的java類中共享一個記錄器。
我正在使用LOG4J2: http ://logging.apache.org/log4j/2.x/manual/configuration.html
main() :
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger LOGGER = Logger.getLogger("GLOBAL");
public static void main(){
...calling other classes
}
}
anyOtherClass :
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");
}
}
的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>
我(或多或少)知道我應該使用LogManager,事實是我應該將其稱為:
private static final Logger logger = LogManager.getLogger(MyApp.class);
或者,在main()中 ,可能像這樣:
private static Logger LOGGER = null;
@BeforeClass
public static void setLogger() {
System.setProperty("log4j.configurationFile","log4j.xml");
LOGGER = LogManager.getLogger();
}
因為,我相信,使用LogManager可以將Log指向xml文件進行設置。 但是,當我構建並運行它時,CLI憤怒在有史以來的第一個日志中退出,並報告: Exception in thread "main" java.lang.NullPointerException at myapp.modules.Database.<init>(Database.java:67)
預期結果 :我要做的就是能夠記錄所有類,並將其寫入文件中。 我就是無法正常工作。 而且當我不使用LogManager時,我只會在控制台上看到日志,但沒有創建文件。 我同時使用Windows和Linux(這就是/ var / log /的原因,但我也將其更改為C:\\)。
我使用的其他網站 : https : //howtodoinjava.com/log4j2/configure-log4j2-for-junit/
不同類的Log4J記錄器 <-對我沒有幫助
..以及許多其他搜索結果已有6年以上的歷史了。
POM.xml :
<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>
您在多個級別上是錯誤的:您將JDK的記錄器與Log4j2的記錄器混合使用,沒有記錄到多個附加程序等。
這是您應該做的:
/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>log4j2test</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<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>
</dependencies>
</project>
基本上,這是唯一沒有錯誤的地方。
/src/main/java/so47656300/App.java
package so47656300;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.info("App.main - starting");
new SecondClass();
logger.info("App.main - ending");
}
}
在這里,您的錯誤是使用java.util.logger.Logger
而不是org.apache.logging.log4j.Logger
。
/src/main/java/so47656300/SecondClass.java
package so47656300;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SecondClass {
private static final Logger logger = LogManager.getLogger(SecondClass.class);
public SecondClass() {
logger.info("SecondClass - starting");
logger.info("SecondClass - ending");
}
}
在這里,您的錯誤還在於使用了錯誤的Logger
類。 僅使用org.apache.logging.log4j.*
類。
/src/main/resources/log4j2.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>
<Root level="INFO">
<AppenderRef ref="console"/>
<AppenderRef ref="fileLogger"/>
</Root>
</Loggers>
</Configuration>
在這里,您的錯誤如下:
log4j2.xml
。 為了進行測試,請創建一個文件/src/test/resources/log4j2-test.xml
。 [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
/var/log/myApp.log
[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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.