java自定义log4j_java – 如何自定义log4j2 RollingFileAppender?

本文档探讨了如何在升级到log4j2时,保持与log4j 1.2.x中自定义RollingFileAppender类似的功能。作者遇到的主要挑战是log4j2的RollingFileAppender不再包含rollOver()方法,而是将其移动到了私有的RollingFileManagerHelper。提出了创建自定义查找器(CustomLookup)作为解决方案,但发现该方法仅在初始化时调用,无法动态更新日志文件头部。作者寻求进一步的帮助以实现所需功能。

我们使用log4j 1.2.x登录我们的产品,并希望在不久的将来迁移到log4j 2.x.我们实现的功能之一是在生成的每个新的翻转日志文件上记录系统信息和其他重要参数.我们在log4j 1.2.x中实现的方式是我们扩展了RollingFileAppender类的log4j并覆盖了rollOver()方法,下面是实现的部分片段

@Override

public void rollOver() {

super.rollOver(); //We are not modifying it's default functionality but as soon as rollOver happens we apply our logic

//

// Logic to log required system properties and important parameters.

//

}

现在我们想要迁移到log4j2,我们正在寻找一种新的解决方案来实现相同的功能.但是当我看到log4j2的源代码时,它与旧的源代码非常不同. RollingFileAppender类不包含rollover()方法,因为它已被移动到RollingManagerhelper并且它已被设置为私有.

开发一个完整的新包并从log4j2扩展/实现一些抽象/辅助类是我们可能的解决方案之一,但这需要大量的编码/复制,因为我们不修改RollingFileAppender所做的事情,而只需要对它进行小的扩展.有一个简单的解决方案吗?

UPDATE

我根据答案中的建议创建了自定义查找,下面是我创建它的方式;

@Plugin(name = "property", category = StrLookup.CATEGORY)

public class CustomLookup extends AbstractLookup {

private static AtomicLong aLong = new AtomicLong(0);

@Override

public String lookup(LogEvent event, String key) {

if (aLong.getAndIncrement() == 0) {

return "this was first call";

}

if (key.equalsIgnoreCase("customKey")) {

return getCustomHeader();

} else {

return "non existing key";

}

}

private static String getCustomHeader() {

// Implementation of custom header

return "custom header string";

}}

但这没有提到的那样;这总是打印这是标题中的第一个调用.我也尝试将breakoint放在第一个if条件上,我注意到它只被调用一次.所以我担心的是,当log4j2从xml config初始化其属性时,customLookup类仅在启动时初始化.我不知道我怎么能实现这个自定义查找类.

更新2

完成上述实现后,我尝试了不同的方法,如下所示;

private static AtomicLong aLong = new AtomicLong(0);

@Override

public String lookup(LogEvent event, String key) {

return getCustomHeader(key);

}

private static String getCustomHeader(final String key) {

if (aLong.getAndIncrement() == 0) {

return "this was first call";

}

if (key.equalsIgnoreCase("customKey")) {

// Implementation for customKey

return "This is custom header";

} else {

return "non existing key";

}

}

但这也是一样的. log4j2在从其xml配置文件初始化时创建标头,然后使用内存中的标头.重写的lookup()方法的返回值不能动态更改,因为它只在初始化期间被调用.任何更多的帮助将受到高度赞赏.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值