在文件log4j2中记录运行时异常

时间:2020-04-11 07:33:47

标签: java exception log4j2

我正在阅读log4j2文档,并且已经使用该库编写了一些代码,但是找不到用于记录运行时异常的解决方案,例如空指针,超时或类似的东西在文件中,我只看到控制台中的那些例外。我已经读过有关此内容的文章,但我看到我可以通过一个方面实现这一点,但是我的问题是:有没有一种方法可以通过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>

我有以下课程:

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,此异常记录在控制台中,而不是记录在File Appender中,我想在我的文件附加器中记录这种异常。

2 个答案:

答案 0 :(得分:0)

检查了所有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类名称和消息。它将被添加到字符串“ 运行时异常:”中,以形成一个要打印的字符串。

因此,您需要将异常作为参数传递给logger.error

logger.error("RunTime Exception: " + e, e);

答案 1 :(得分:-1)

Log4j2文件附加程序:

您是否定义了Log4j2 File appender

因此,登录到文件不需要对Java代码进行任何更改。也许没有它也可以登录到控制台,但是我在项目根目录中有一个log4j2.xml文件,用于定义Log4j2的记录方式。

这是我当前的版本,其中定义了Console appenderFile appender

    <?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 Configuration page

如果需要,请查看其他可用的附加程序类型here。如果您对日志消息的显示方式不满意,可以在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并掷出RuntimeExceptionException是已检查的异常-因此调用代码将需要捕获它,而RuntimeExceptionException的子类)是未检查的异常。因此,通过抛出RuntimeException,我有点暗示完全出乎意料的事情发生了,并且调用代码不知道如何处理它-因此他们不需要catch,并且因为它是未经检查的异常,所以不必。

因此,根据您的要求,在catch子句中,您可以抛出ExceptionRuntimeException或您自己的自定义异常,该异常可以是检查异常(a Exception的子类)或未经检查的异常(RuntimeException的子类)。

如果您没有从Exception子句中抛出catch,则代码将在catch子句之后继续执行,这很可能不是您想要的。

我看到您的代码在public static void main(String args[])方法内部。因此,也许您不必从Exception子句中抛出catch,因为无论如何,如果catch子句位于{方法的结尾。如果您从该方法中抛出某些东西,也许Java会在控制台上打印一些东西-但catch不会捕获并记录它。


记录方面:

我看到您可以使用方面进行记录。例如,请参见here。就是说,我将尽力使所有与Log4j2一起使用。我不必使用方面来进行日志记录,并且感觉它的一些工作尚不清楚,因此我无法为此提供帮助。

希望我剩下的答案很有用:)

相关问题