[英]Log runtime exceptions in file log4j2
我正在閱讀 log4j2 文檔,並使用該庫編寫了一些代碼,但我找不到記錄運行時異常的解決方案,例如 null 指針、超時或類似文件中的內容,我只是在文件中看到這些異常控制台。 我已經讀過這個,我發現我可以通過一個方面來實現這一點,但我的問題是:有一種方法可以通過 XML 配置將這些異常記錄在文件中?
編輯:
我有一個 log4j2 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="5">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%r %d{yyyy-MM-dd HH:mm:ss:sss} %c %L %M %sn [%t] %-5p %m%n</Pattern>
</PatternLayout>
</Console>
<File name="testingFile" fileName="testLog4j.log" append="true" ignoreExceptions="false" immediateFlush="true">
<!--Layout type="PatternLayout">
<Pattern>%r %d{yyyy-MM-dd HH:mm:ss:sss} %c %L %M %sn [%t] %-5p %msg%n</Pattern>
</Layout-->
<PatternLayout alwaysWriteExceptions="false">
<Pattern>"%-5p [%t] %logger - %msg%ex%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="all">
<AppenderRef ref="console" level="info"/>
<AppenderRef ref="testingFile" level="error"/>
</Root>
<!--Logger name="com.example" level="error" additivity="true">
<AppenderRef ref="testingFile" />
</Logger-->
</Loggers>
</Configuration>
我有以下 class:
public class Application {
private static final Logger logger = LogManager.getLogger(Application.class.getName());
public static void main(String args[]) throws Exception{
while(true){
//logger.debug("test");
logger.trace("trace");
logger.debug("debug");
logger.info("test");
logger.warn("test");
logger.error("test");
logger.fatal("test");
logger.error("test");
String s = null;
s.substring(0);
}
}
當您到達s.substring(0)
,您會得到一個NullPointerException
,此異常記錄在控制台中,而不是文件附加程序中,我想在我的文件附加程序中記錄此類異常。
檢查了您所有的 XML 配置,它們似乎還可以。 您需要在文件中記錄運行時異常的唯一事情是:
private static final Logger logger = LogManager.getLogger(Log4j2Example.class);
public static void main(String[] args) {
try {
String s = null;
s.substring(0);
} catch (Exception e) {
logger.error("RunTime Exception: " + e, e);
}
}
Exception 的toString
繼承自Throwable
,它打印 Exception class 名稱和消息。 這被添加到字符串“ RunTime Exception: ”以形成一個正在打印的字符串。
因此,您需要將異常作為參數傳遞給logger.error
。
logger.error("RunTime Exception: " + e, e);
您是否定義了Log4j2
文件附加程序?
因此,登錄到文件不需要對您的 Java 代碼進行任何更改。 也許沒有它登錄到控制台也可以,但是我的項目根目錄中有一個log4j2.xml
文件,它定義了Log4j2
應該如何記錄。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
可能還有其他方法可以達到相同的結果。 查看Logj42 配置頁面。
如果您願意,請查看此處可用的其他類型的附加程序。 如果您對日志消息的顯示方式不滿意,可以閱讀Pattern layouts 。
您詢問了日志記錄錯誤,並且似乎能夠成功記錄一般日志語句。
您只需將代碼包裝在try-catch中。
例如:
try {
logger.info("Hello world");
// I want to test my exception handling
throw new RuntimeException("Triggering an error");
} catch (Exception e) {
String errorMessage = "An error has occurred";
logger.error(errorMessage, e);
throw new RuntimeException(errorMessage, e);
}
請注意,我捕獲了一個Exception並拋出了一個RuntimeException 。 Exception
是已檢查的異常 - 因此調用代碼需要捕獲它,而RuntimeException
( Exception
的子類)是未經檢查的異常。 因此,通過拋出RuntimeException
,我有點暗示發生了一些完全出乎意料的事情,並且調用代碼不知道如何處理它——所以他們不需要catch
它,因為它是一個未經檢查的異常,他們不會不必。
因此,在catch
子句中,您可以根據您的要求拋出Exception
或RuntimeException
或您自己的自定義異常,該異常可以是已檢查異常( Exception
的子類)或未檢查異常( RuntimeException
的子類) .
如果您不從catch
子句中拋出Exception
,則代碼將在catch
子句之后繼續執行,這很可能不是您想要的。
我看到您的代碼在public static void main(String args[])
方法中。 因此,也許您不必從catch
子句中拋出Exception
,因為如果catch
子句位於方法的末尾,程序執行將在任何情況下在catch
子句之后停止。 如果您從該方法中拋出一些東西,也許 Java 會在控制台上打印一些東西 - 但它不會被Log4j2
捕獲和記錄。
我看到您可以使用方面進行記錄。 例如,請參見此處。 也就是說,我將嘗試讓一切都與try-catch
一起工作。 我不必使用方面進行日志記錄,感覺它有點工作以獲得不太清楚的好處,所以不幸的是我無法提供幫助。
希望我回答的 rest 有用:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.