静默忽略Logback内部异常

时间:2015-07-13 16:27:16

标签: java logback

我正在学习JAVA,今天正在玩Logback。作为对自己的练习,我编写了一个自定义“appender”来将日志(对于Spring)写入MongoDB集合。在追踪到一个错误后,我发现如果我的appender抛出一个异常,那么这只是默默地被忽略了,应用程序继续运行但是现在有问题的记录器已经死了。

抛出异常的地方:

public class MongoDBAppender extends AppenderBase<ILoggingEvent> {
   ...
  protected void append(ILoggingEvent event) {
    ...
    throw new RuntimeException("My example exception!");

由于我想在开始时打开一个MongoDB会话,然后开始记录,然后让Spring继续,我以编程方式设置这个appender:

MongoClient mongoClient = new MongoClient("localhost:27017");

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
PatternLayoutEncoder ple = new PatternLayoutEncoder();
ple.setContext(lc);
ple.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n");
ple.start();

MongoDBAppender mongoDBAppender = new MongoDBAppender();
mongoDBAppender.setContext(lc);
mongoDBAppender.setEncoder(ple);
mongoDBAppender.setmongoDBName("test");
mongoDBAppender.setmongoDBCollectionName("my_log");
mongoDBAppender.start();

Logger logger = (Logger) LoggerFactory.getLogger("org.springframework");
logger.addAppender(mongoDBAppender);
logger.setLevel(Level.INFO);
logger.setAdditive(false);

其他记录器在logback.xml中通常定义。

因此,此应用程序正常运行,但org.springframework没有记录任何内容。如果我将logback.xml文件更改为以:

开头
<configuration debug="true">

然后我从Logback本身获得一个完整的调试输出,然后我确实看到我的异常被抛出。

  

当且仅当出现错误时,有没有办法获得这种输出?

1 个答案:

答案 0 :(得分:0)

经过一番挖掘后,doAppend中的AppenderBase方法似乎捕获异常并将其记录到内部Logback日志中:如果我们使用<configuration debug="true">选项,则只会显示这些异常。 doAppend方法实际上是调用我的自定义append

我的解决方法:在append中自己捕获所有异常,然后将它们记录到我自己的记录器(对于MongoDBAppender)。然后我们可以决定如何(或是否)显示此类消息。