当前位置: 首页 > 知识库问答 >
问题:

Log4j选择性追加器

廉展鹏
2023-03-14

我有一个java应用程序,它有三个“形上说”的对象。。。1类动物,1类食物,这些与任何遗传或接口无关。。班级经理的最后一个任务是列出动物和食物的清单,经理负责动物园里的动物和食物。。

说到点子上。。。

我正在使用log4j,我需要登录到一个txt文件,如果并且仅当动物列表中的某些内容发生变化。。。(动物死了,出生了,或者什么的…)我需要登录系统。当且仅当食物清单中的某些东西发生变化时。。。(需要新的食物,吃过的食物,等等…)

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

我在这里发现:Log4j:在运行时创建/修改附加程序,重新创建日志文件,而不是附加

比如动态改变附属物

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个答案

仲涵亮
2023-03-14

我就是这样让它工作的:

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");
} 
郦楷
2023-03-14

您可以严格地从log4j中的配置执行此操作。xml文件。您可以在其中定义两个appender,然后有两个记录器元素,一个将动物绑定到第一个appender,另一个将食物绑定到另一个appender。也许您也应该有一个元素来定义默认行为。

 类似资料:
  • 我试图用log4j的JPA Appender保存一些日志事件,我在这里遵循了教程(JPAAppender)。 但是当我测试记录器时,我得到一些关于log4j的log4j错误/警告。特性: 假设问题在log4j。属性文件,有帮助吗??谢谢

  • 我目前正在对一个相对较大的项目的log4j配置进行微调。目前,我还没有为所有可能创建日志项的位置配置日志级别。 我想让log4j拥有某种回退appender来记录没有为其配置其他appender的所有消息。例如,如果我有一条日志消息: 登录: a. b. c. d: WARN 并且有一个附加程序,配置为用级别INFO记录包a. b. c,然后输出记录到该附加程序。 但是,如果我没有配置append

  • 当用户从用户界面更改配置时,我想动态地重新加载log4j附加器(RollingFileAppender)。 我已经通过编程删除了追加器,并用新的配置值创建了新的追加器。在此之后,appender broked MaxBackupIndex和MaxFileSize无法正常工作。但是如果我更改了文件名(日志文件名),那么它可以正常工作。 能帮我解决这个问题吗?

  • 我正在尝试添加选项到一个动态选择输入,依赖于在另一个选择下拉菜单中选择的值。 我已经设法在选择父级中的值时填充数据对象。所有的my触发器也会被执行,子select被禁用,它应该包含数据对象中的所有值,但是它没有填充任何选项。 JS(Coffeescript)代码段: 最后一节特别重要,因为这是JSON数据对象应转换为新选项的地方。下面是在一种情况下响应的对象(根据Firebug): 在本例中,儿童

  • 我很难理解可加性、类别日志级别和追加器阈值之间的关系。 下面的场景(我的log4j.properties文件): null

  • 我试图在spark executor中使用自定义的log4j appender,以便将所有日志转发到Apache Kafka。 大卫