【问题标题】:Java - Log4j2 programmatically add ErrorHandlerJava - Log4j2 以编程方式添加 ErrorHandler
【发布时间】:2020-06-04 15:43:23
【问题描述】:

我正在使用 Log4j2。 要求是,如果记录器无法写入日志文件(访问被拒绝、锁定等),应用程序应关闭。

我编写了以下类来实现这一点:


import org.apache.logging.log4j.core.ErrorHandler;

public class LogFileErrorHandler extends ErrorHandler {
   private static final Logger LOGGER = StatusLogger.getLogger();

   @Override
   public void error(String msg) {
      LOGGER.error(msg);

      System.exit(ExitCodes.IO_LOGGER_COULD_NOT_WRITE);
   }

   ... more error implementations
}

我正在使用此处的代码以编程方式构建我的 FileLogger:

public static final ConfigurationBuilder<BuiltConfiguration> BUILDER = ConfigurationBuilderFactory.newConfigurationBuilder

public void initFileLoggerWithFilePattern(final String pattern) {
   final LoggerComponentBuilder   logger   = BUILDER.newLogger("FileLogger", Level.DEBUG);
   final AppenderComponentBuilder appender = createFileAppenderWithFilePattern(pattern);

   BUILDER.add(appender);

   logger.add(BUILDER.newAppenderRef("RollingFileAppender"));

   BUILDER.add(logger);

   Configurator.initialize(BUILDER.build());
}

public AppenderComponentBuilder createFileAppenderWithFilePattern(final String pattern) {
   final AppenderComponentBuilder acb = BUILDER.newAppender("RollingFileAppender", "RollingFile");
   acb.addAttribute("fileName",    pattern); 
   acb.addAttribute("filePattern", pattern);
   acb.addComponent(createPatternLayout());
   acb.addComponent(createTimeBasedTriggeringPolicy());

   return acb;
}

public LayoutComponentBuilder createPatternLayout() {
   final LayoutComponentBuilder lcb = BUILDER.newLayout("PatternLayout");
   lcb.addAttribute("pattern", "%d{yyyy-MM-dd HH:mm:ss.SSS}{GMT}Z %m");

   return lcb;
}

public ComponentBuilder createTimeBasedTriggeringPolicy() {
   final ComponentBuilder policies = BUILDER.newComponent("Policies");
   final ComponentBuilder policy   = BUILDER.newComponent("TimeBasedTriggeringPolicy");

   policies.addComponent(policy);

   return policies;  
}

现在我的问题是:

我知道在 Log4j 1.X.X 版本中,向 Logger 添加错误处理程序非常容易。 你可以这样做:

logger.setErrorHandler(your error handler);

如何使用上面的代码在 Log4j2 版本 2.13.3 中执行此操作?

【问题讨论】:

  • @Coolman 这不是我需要的。如果出现故障,我需要应用程序关闭。不要更改附加程序。

标签: java log4j2


【解决方案1】:

这是一个错误。请为它创建一个Jira 问题。 AbstractAppender 支持通过 setErrorHandler 方法添加错误处理程序,但是没有 ErrorHandler 插件类型,并且 AbstractAppender 的 Builder 不提供错误处理程序属性来指定一个。这意味着实现这一点的唯一方法是编写客户 Appender 或为 Appender 编写包装器,在其构造函数或启动方法中注入错误处理程序。

【讨论】:

  • 添加ErrorHandler 后,我可以通过从LogContext 获取Appenders 来添加它们。不幸的是,即使我的 ErrorHandler 现在已添加到附加程序中。当由于某种原因发生异常时,不会调用 ErrorHandler。我锁定了一个文件以强制产生 IOException,它由 DefaultExceptionHandler 处理。难道是我不需要添加ErrorHandler而是和ExceptionHandler?
猜你喜欢
  • 2014-07-20
  • 2013-03-04
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2012-02-29
相关资源
最近更新 更多