我正在阅读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中,我想在我的文件附加器中记录这种异常。
答案 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
File appender?
因此,登录到文件不需要对Java代码进行任何更改。也许没有它也可以登录到控制台,但是我在项目根目录中有一个log4j2.xml
文件,用于定义Log4j2
的记录方式。
这是我当前的版本,其中定义了Console appender和File 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并掷出RuntimeException。 Exception
是已检查的异常-因此调用代码将需要捕获它,而RuntimeException
(Exception
的子类)是未检查的异常。因此,通过抛出RuntimeException
,我有点暗示完全出乎意料的事情发生了,并且调用代码不知道如何处理它-因此他们不需要catch
,并且因为它是未经检查的异常,所以不必。
因此,根据您的要求,在catch
子句中,您可以抛出Exception
或RuntimeException
或您自己的自定义异常,该异常可以是检查异常(a Exception
的子类)或未经检查的异常(RuntimeException
的子类)。
如果您没有从Exception
子句中抛出catch
,则代码将在catch
子句之后继续执行,这很可能不是您想要的。
我看到您的代码在public static void main(String args[])
方法内部。因此,也许您不必从Exception
子句中抛出catch
,因为无论如何,如果catch
子句位于{方法的结尾。如果您从该方法中抛出某些东西,也许Java会在控制台上打印一些东西-但catch
不会捕获并记录它。
我看到您可以使用方面进行记录。例如,请参见here。就是说,我将尽力使所有与Log4j2
一起使用。我不必使用方面来进行日志记录,并且感觉它的一些工作尚不清楚,因此我无法为此提供帮助。
希望我剩下的答案很有用:)