簡體   English   中英

在文件 log4j2 中記錄運行時異常

[英]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 文件附加器:

您是否定義了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是已檢查的異常 - 因此調用代碼需要捕獲它,而RuntimeExceptionException的子類)是未經檢查的異常。 因此,通過拋出RuntimeException ,我有點暗示發生了一些完全出乎意料的事情,並且調用代碼不知道如何處理它——所以他們不需要catch它,因為它是一個未經檢查的異常,他們不會不必。

因此,在catch子句中,您可以根據您的要求拋出ExceptionRuntimeException或您自己的自定義異常,該異常可以是已檢查異常( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM