【问题标题】:Logback internal exception being silently ignoredLogback 内部异常被静默忽略
【发布时间】:2015-07-13 16:27:16
【问题描述】:

我正在学习 JAVA,今天正在玩 Logback。作为我自己的练习,我编写了一个自定义“附加程序”来将日志(用于 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 本身获得完整的调试输出,然后确实看到我的异常被抛出。

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

【问题讨论】:

    标签: java logback


    【解决方案1】:

    经过一番挖掘,似乎AppenderBase 中的doAppend 方法捕获了异常并将它们记录到内部Logback 日志中:只有在我们使用&lt;configuration debug="true"&gt; 选项时才会显示。 doAppend 方法实际上称为我的自定义 append

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-07
      • 2011-07-02
      • 2021-04-17
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多