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

在Java中启动Log4j2 RollingFileAppender

王刚毅
2023-03-14

我正在使用log4j2。

我想创建一个RollingFileAppender,它每天旋转日志文件。在应用程序启动之前,日志文件的名称是未知的(日志文件名是从应用程序配置组装而来的)。

这就是为什么我需要在运行时添加RollingFileAppender。

我有以下代码:

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;  
}

问题是这段代码完全没有改变什么。未向配置中添加追加器和记录器。以编程方式创建的“文件记录器”不可用。

执行上述代码后,我使用此代码打印记录器和附加器。


private void printLog4jConfig() {
   final LoggerContext context = (LoggerContext) LogManager.getContext(false);
   final Configuration config  = context.getConfiguration();


   // Print appenders
   for(Appender app : config.getAppenders().values()) {
      System.out.println(app.getName());
   }

   // Print Loggers and their Appenders
   for(LoggerConfig lc : config.getLoggers().values()) {
      System.out.println(lc);

      for(Appender app : lc.getAppenders().values()) {
         System.out.println("   " + app);
      }
   }
}

输出:

Appenders
-------------
STDOUT


Loggers
-------------
root
   STDOUT
Console
   STDOUT

我的问题:

我的代码有什么问题?为什么我的Appender和Logger没有添加?分别为什么配置没有被刷新/更新?

如何在运行时将RollingFileAppender以及记录器添加到log4j2配置?

共有1个答案

安轶
2023-03-14

我找到了解决我问题的办法。

而是使用

配置程序。初始化(BUILDER.build())

我不得不使用

Configurator.reconfigure

这重新加载了配置,我能够看到和使用我的appender和记录器。

 类似资料:
  • 我有一份Java申请。 应用程序有一个决定应用程序是否在启动时启动的设置。 目前,我通过在StartUp items文件夹中放置/删除快捷方式实现了这一点。 然而,我想知道是否有更好的方法来处理这种行为。 编辑 是的,是视窗。抱歉之前没有清除。 应用程序有一个UI,用户可以在其中触发操作,并且应用程序在运行时定期在后台运行一些任务。 @Peter,如何使用应用程序中的代码更改注册表?这种方法是否与

  • 问题内容: 我很难找到一种方法来启动,停止和重新启动Java中的线程。 具体来说,我在中有一个类Task(当前实现)。我的主应用程序需要能够在线程上启动此任务,在需要时停止(杀死)该线程,有时还可以杀死并重新启动该线程… 我的第一次尝试是与,但我似乎找不到办法重新启动任务。当我使用任何将来的呼叫失败时,因为是“关机” … 那么,我该怎么做呢? 问题答案: 一旦线程停止,你将无法重新启动它。但是,没

  • 当一个对象被创建时(当构造函数被调用时),有没有一种替代的方法来启动一个线程。我知道你不能在构造函数中启动线程。但是如果我在类中有两个方法(类被称为任务),它们实现了Runnable: run(),连续的Recv()。run()方法调用连续的Recv()函数。连续的Recv()做一些事情。然后我在公共类中创建了一个私有类,名为start ContRecv(),在构造函数调用中启动线程,就像这样 我

  • 问题内容: 我的服务器程序需要在EC2实例启动时启动。即时即时消息只是使用以下命令从我的SSH启动: 我尝试将其添加到.bashrc和/etc/rc.local文件中,但它们仅在我ssh进入时才起作用。 有人知道怎么做,以便在计算机启动时启动我的应用程序实例吗? 谢谢, 本 问题答案: 您可以创建如下脚本: 将您的脚本放在/etc/init.d目录下,然后使用以下命令: 通过使用有关 update

  • 问题内容: 我的webapp是部署到websphere服务器中的较大EAR的一部分。该服务器在同一虚拟服务器上托管许多其他应用程序。我的webapp在ServletContextListener-> contextInitialized方法中进行了一些初始化/运行状况检查。如果初始化/运行状况检查失败,我想使Web应用程序不可用。什么是实现此目的的可行方法?从contextInitialized内

  • 我想用chrome自动化一些操作,我使用的是Selenium和chromedriver,但在执行时我遇到了这个错误 我看到我需要用