Log4j 选择性追加器
Log4j selective appender
我有一个 java 应用程序,它具有“假设性的”3 个对象...
classAnimal 的 1,classFood 的 1,它们没有任何继承或接口相关。 .最后一个 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");
}
我有一个 java 应用程序,它具有“假设性的”3 个对象... classAnimal 的 1,classFood 的 1,它们没有任何继承或接口相关。 .最后一个 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");
}