当前位置: 首页 > 知识库问答 >
问题:

Java - Log4j2 以编程方式添加错误处理程序

桓高澹
2023-03-14

我正在使用 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
}

我用下面的代码以编程方式构建我的文件记录器:

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.setErrorHandler(your error handler);

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

共有1个答案

赵高韵
2023-03-14

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

 类似资料:
  • 我正在尝试在Android上添加Wifi网络,我想知道如何连接到不广播其SSID的Wifi网络(它是否有空SSID或带有\0s的清晰SSID)。 这是我目前用于广播其SSID的Wifi网络的内容:

  • 我有一个模型,其中有一个@列(nullable=false)注释HiberNate和所有字段有nullable=false,我想以编程方式添加一些新的注释,如@NotNull和@ApiModelProperty(必需=true)-用于招摇过市。 所以,我希望能够从我的应用程序的模型中解析所有字段,获得现有的注释,并在此基础上添加新的注释。这能做到吗? 更新:问题是每次添加一个新字段,如果它不能为空

  • 问题内容: 是否可以使用XML配置中的规范以编程方式添加Log4J2附加程序? 我计划在log4j2.xml中定义所有内容,然后按情况选择追加器(不会编译): 问题答案: 编辑:有关log4j2的最新版本,请参阅下方答案 我给他们留下了不希望您这样做的印象,但这对我有用:

  • 问题内容: 我想以编程方式从应用程序中加载Log4j2 XML配置文件。 试过这个: 还有这个: 但是什么都没有。 问题答案: 自己找到答案。有人可能会觉得有用。

  • 问题内容: 当我需要保存一个对象列表时,每个对象都应保存在它自己的事务中(这样,如果一个对象失败了,它们就不会全部失败),我可以这样做: 我之所以使用,是因为如果一本书无法保存并且交易被回滚,则该会话将无效,这将阻止后续书籍的保存。但是,这种方法存在两个问题: 有点冗长 即使上一本书成功,也会为每本书创建一个新的会话 有没有更好的办法?我发生的一种可能性是依赖注入Hibernate,然后执行此操作

  • 我正在使用SpringDoc,并试图以编程方式向OpenApi添加一个模式,但没有成功。 mySchema的描述没有添加到我在生成的YAML文件中看到的模式列表中,如果我试图引用它: