Log4j 选择性追加器

Log4j selective appender

我有一个 java 应用程序,它具有“假设性的”3 个对象... classAnimal 的 1,classFood1,它们没有任何继承或接口相关。 .最后一个 class 经理 有一份动物清单和食物清单,经理负责这些动物和食物所在的动物园..

进入正题...

我正在使用 log4j,我需要 登录到 txt 文件,仅当且仅当 动物列表中的某些内容发生变化时...(动物死亡、出生或其他任何情况) ...) 我需要 登录到 System.out 当且仅当 食物列表中的某些东西发生变化时...(需要新食物,食物被吃掉,什么曾经...)

我的问题:

我如何使用 log4j 做到这一点?

我在这里找到: Log4j : Creating/Modifying appenders at runtime, log file recreated and not appended

类似于动态更改 appender

String targetLog="where ever you want your log"
FileAppender apndr = new FileAppender(new PatternLayout("%d %-5p [%c{1}] %m%n"),targetLog,true);    
logger.addAppender(apndr);
logger.setLevel((Level) Level.ALL);

但我认为这是非常丑陋且容易出错的,因为在整个漏洞应用程序中不断添加和删除 appender..

有没有更好的方法来处理这个问题 我可以有 2 个记录器(一个用于动物 1 个用于食物)吗?

有什么建议吗??

谢谢

您可以严格按照 log4j.xml 文件中的配置执行此操作。您可以在其中定义两个 appender,然后有两个记录器元素,一个将动物与第一个 appender 联系起来,另一个将食物与另一个 appender 联系起来。可能你也应该有一个元素来定义默认行为。

我是这样工作的:

配置属性

log4j.rootLogger=TRACE, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%5F:%t:%L] - %m%n

log4j.appender.animalLogger=org.apache.log4j.FileAppender
log4j.appender.animalLogger.File=animal.log
log4j.appender.animalLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.animalLogger.layout.ConversionPattern=%d [%5F:%t:%L] - %m%n

log4j.category.animalLogger=DEBUG, animalLogger
log4j.additivity.animalLogger=false

log4j.category.foodlLogger=DEBUG, stdout
log4j.additivity.foodlLogger=false

static final Logger animalLogger = Logger.getLogger("animalLogger");
static final Logger foodlLogger = Logger.getLogger("foodlLogger");

并加载记录器和日志记录:

public static void main(String[] args) {
    PropertyConfigurator.configure("log4j.properties");
    animalLogger.debug("Hello animalLogger message");   
    foodlLogger.debug("Hello reportsLog message");
}