Log4j选择性appender

时间:2016-04-28 18:04:37

标签: java log4j

我有一个java应用程序,其中包含' hypotetically speak '3个对象... 1类Animal 1类Food ,这些与任何继承或接口无关......以及类管理器的最后一个这里有一份动物名单和食物清单,经理负责这些动物和食物的动物园..

到了......

我使用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用于食物)??

任何建议??

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这就是我开始工作的方式:

配置属性

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");
}