gpt4 book ai didi

java - 根据收到的参数动态选择 log4j 附加程序

转载 作者:行者123 更新时间:2023-12-02 12:41:03 26 4
gpt4 key购买 nike

我有 log4j 附加程序(appendersB、appendersC)和如下所示的特定类

class A { A{Parent a}}

其中 Parent 是一个具有以下两个实现的接口(interface)

class B implements Parent {..}
class C implements Parent {..}

现在我想告诉 log4j,每当使用参数 B 实例化类 A 时,它都应该使用appendersB,如果它接收到 C,那么它应该使用appendersC。

这可能吗?

最佳答案

附加程序的选择是在 Log4j 配置文件中根据记录器名称完成的,因此为了能够配置它以便日志记录条目转到不同的附加程序,您的代码应该使用不同的记录器。

通常,记录器名称是完全限定的类名称,并且记录器被创建为类的静态字段。这样做是为了提高性能、减少内存占用以及命名方便。

但是,您可以将记录器字段设置为非静态,并为其分配动态生成的名称。

例如,您的 A 类通常会执行以下操作:

package org.example;
public class A {
private static final Logger log = LogManager.getLogger(A.class);
// rest of code
}

这将创建一个名为org.example.A的记录器,它可以配置为写入任何选择的附加程序。

对于作为构造函数参数给出的实际对象类的基础记录器(因此可能是附加程序),您可以执行以下操作:

package org.example;
public class A {
private final Logger log; // not static
public A(Parent p) {
this.log = LogManager.getLogger(getClass().getName() + "." +
p.getClass().getSimpleName());
}
}

这将为 A 的每个实例创建一个记录器,名称源自构造函数参数,例如

new A(new B()) // Logger name: org.example.A.B
new A(new C()) // Logger name: org.example.A.C

您现在可以配置 Log4j 将记录器 org.example.A.B 定向到 appenderB,并将记录器 org.example.A.C 定向到 appenderC.

您当然可以以任何您想要的方式构建动态记录器名称。记录器名称不必基于类名称,例如您可以将它们命名为 bravo.foocharlie.foo

关于java - 根据收到的参数动态选择 log4j 附加程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44932329/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com