如何使用带有log4j2的Java日志记录正确管理使用插件创建的日志文件的生命周期

Jas*_*n S 8 java logging log4j2

我的团队正在开发一个NetBeans插件,它使用日志记录到指定的文件.日志系统使用SLF4J + Log4J2; 我所知道的唯一配置信息是具有log4j2.xml该插件的日志记录属性的文件,以及以下内容:

    LoggerContext loggerContext = (LoggerContext)LogManager.getContext(false);
    loggerContext.reconfigure();
Run Code Online (Sandbox Code Playgroud)

(我使用SLF4J和NetBeans的事实在这里并不重要.)

我的问题是,当插件启动时开始记录的正确方法是什么,并在插件退出时停止记录?(JVM继续使用NetBeans,因此日志文件不会自动关闭.)

我抬起头LoggerContext,我看到stop()terminate()方法,但我找不到应用程序应该如何使用任何文件LoggerContext,所以我不知道这是否LifeCycle东西是内部细节或一些应用程序应该使用.


一些更具体的细节:

我们的插件生命周期类似于下图(一次只允许一个实例运行)."A"和"B"指的是我们希望生效的日志配置.

     [Something starts within the JVM to load log4j classes first.
      It might be our plugin, it might be something else.
A     log4j's default mechanism kicks in to create log configuration A]
|
|    [time passes]
|
|    [our plugin starts]
A    [log4j classes first loaded, 
|    default mechanism kicks in to create log configuration A]
A    setup log configuration B
A B  log event 1
A B  log event 2
A B  log event 3
A    shutdown log configuration B
|    [our plugin exits]
|
|    [time passes]
|
|    [our plugin starts]
A    setup log configuration B
A B  log event 1
A B  log event 2
A B  log event 3
A    shutdown log configuration B
|    [our plugin exits]
|
|    [time passes]
|
     [JVM exits]
Run Code Online (Sandbox Code Playgroud)

配置A与JVM关联,并且是第一次由JVM加载时由log4j创建的默认配置.

配置B由插件以编程方式进行管理,并且应具有独立于配置A的显式启动/关闭(并且配置A不应受到影响).

有没有办法用log4j 2.0实现这个目标?

rgo*_*ers 2

在 Log4j 2.5 中,您可以调用 Configurator.shutdown()。使用 Log4j 2.6,您可以调用 LogManager.shutdown()。