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

如何在服务器重启或更改xml配置文件后保留log4j2的插件配置

穆英飙
2023-03-14

我已经开发了一个自定义滚动文件附加器,它工作得很好。唯一的问题是,每次我重新启动服务器或更改log4j2时,它都会被重新初始化。xml文件(文件的任何部分)和之前的所有日志会突然被删除。我还没有观察到默认附加器的这种行为,所以我想知道我能做些什么来保留我的配置。

<CustomAppender name="CustomAppender"
                                     fileName="${log.file.directory}/file.log"
                                     filePattern="${log.file.directory}/file.log.%d{yyyy-MM-dd}-%i.gz"
                                     immediateflush="true"
                                     append="true">
        <CustomLayout/>
        <Policies>
            <SizeBasedTriggeringPolicy size="3 KB"/>
            <TimeBasedTriggeringPolicy interval="1"/>
        </Policies>
    </CustomAppender>

附言:我试图使它成为一个单例,但除此之外,它不起作用,我真的不想让它远离被重新配置,我只想保留我以前生成的日志。

使现代化

显然,每次服务器关闭或log4j2.xml文件被更改时,管理器都会从头开始重新构建appender,尽管内置appender即使在重新启动或重新配置后也会保留其状态。他们通过覆盖AbstractOutputStreamAppender中的“停止”方法来做到这一点。我对我的appender做了同样的事情,但它的行为仍然不如我预期的那样。

@Override
public boolean stop(long timeout, TimeUnit timeUnit) {
    setStopping();
    final boolean stopped = super.stop(timeout, timeUnit, false);
    setStopped();
    return stopped;
}

这是我在appender builder中使用的管理器:

final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, append,
                isBufferedIo, policy, strategy, advertiseUri, layout, bufferSize, isImmediateFlush(),
                createOnDemand, filePermissions, fileOwner, fileGroup, getConfiguration());
        if (manager == null) {
            return null;
        }
        manager.initialize();

共有1个答案

宇文修筠
2023-03-14

当重新配置发生时,会发生以下情况:

  1. 读取新的配置文件并将其转换为节点树
  2. 访问与节点关联的插件,并创建相应的类
  3. 如果配置创建成功,则会启动配置
  4. 更新记录器以参考新配置
  5. 旧配置已停止

正如您可能想象的那样,由于同时运行两个配置,这可能会导致问题。例如,如果两个组件都尝试使用相同的端口,那么第二个配置可能会失败。为了避免这些问题,Log4j 2中的应用程序使用管理器。Manager通常会有一个“名称”,其中包含任何项目,如果它们在新配置中具有相同的值,则表明Manager应该被重用。这允许像OutputStreams这样的东西在重新配置期间保持打开状态。但是,这样做的副作用是,如果在附加程序上更改了参数并且不是“名称”的一部分,则可能会忽略值的更改,因为没有修改Manager。

因此,在创建新的附加器时,必须注意传递给管理器的名称,如果附加器不属于名称,则应尝试更新管理器中的相关值。此外,经理必须说明它被多次启动和停止。AbstractManager实际上会为您处理这个问题。

 类似资料:
  • 我想使用新的log4j2-Java日志框架。一切正常,但我从一小时后就尝试加载一个自定义配置文件来配置日志记录(如日志级别)。 这是我的log4j2.xml: 我尝试了以下方法,但没有任何效果: 移动log4j2.xml文件,使其位于默认包中。 将log4j2.xml文件移动到项目中的任意位置 将log4j2.xml文件命名为log4j.xml 在项目中创建一个文件夹,将log4j2.xml文件放

  • 本文向大家介绍harbor修改配置文件后重启操作,包括了harbor修改配置文件后重启操作的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 补充知识:装好Harbor后,docker连接该本地仓库报错 装好Harbor后,docker连接本地仓库报错。 需要配置vim /usr/lib/systemd/system/docker.service 然后重启docke

  • 问题内容: 我想使用新的Log4J 2-Java Logging Framework。一切正常,但是一个小时以来,我尝试加载一个自定义配置文件来配置日志记录(如日志级别)。 这是我的log4j2.xml: 我尝试了以下方法,但没有任何效果: 移动log4j2.xml文件,使其位于默认软件包中。 将log4j2.xml文件移动到项目中的任何位置 将log4j2.xml文件命名为“ log4j.xml

  • 部署配置文件是 Puppet 最常见的用途之一。许多服务都需要一些配置文件, 你可以让 Puppet 使用 file 资源将这些配置文件推送到客户端,如下面的代码所示: file { "/opt/nginx/conf.d/app_production.conf": source => "puppet:///modules/app/app_production.conf", } source

  • 最近,我决定学习如何使用log4j2记录器。我下载了所需的jar文件,创建了库,xml编译文件,并尝试使用它。不幸的是,我在console(Eclipse)中得到了这样的语句: 这是我的测试类代码: 和我的xml配置文件: 我还尝试使用不带标记的xml,以及包规范和各种文件夹/包目录,但没有帮助。现在我的文件直接位于Eclipse的project文件夹中。

  • 我正在使用log4j的现有系统上工作,我想更新到log4j2。 有一个自定义Springbean从文件加载配置。我需要保持这种方法。我不能使用"log4j.configuration文件"系统属性。 我们有一个属性文件,其中指定了当前log4j.xml的路径(NFS共享) Springbean有以下代码。。。 } 在log4j2中,没有PropertyConfiguration。如何加载log4j