动态创建和销毁日志附加器

5
我有一个遗留的PSVM应用程序,我想将其日志输出重定向到每个执行的唯一文件。 因此,如果我在10:00调用它,那么它会将输出重定向到{thread-id}-10:00.log;另一个执行线程可能在10:01开始执行,并且它的输出将转到{thread-id}-10:01.log。 我知道这不太优雅。
我的问题是:
  • 这可能吗?
  • 是否有人有思路如何处理?
  • 当不再需要appender时,是否可以释放/销毁它?
谢谢!
2个回答

4
我建议从FileAppender开始,然后根据需要创建自己的版本。在创建文件之前,只需修改您的版本以获取当前线程ID并将合适的线程ID /时间戳附加到文件中即可。您可以维护一个(缓冲)FileWriter映射,以线程ID为键。
编写appender非常简单-这里是Javaworld指南,详细介绍了如何编写appender:点击此处
在上述内容中,您的程序是否有可能在一分钟内启动两次?您是否希望添加进程ID或类似内容以保持唯一性?

谢谢您的快速回答!一个线程不会执行多次。但无论如何,这只是一个讨论的例子。名称将被限定为唯一性。 有关如何释放文件写入器的任何想法吗? - Edward Q. Bridges
关于释放。我认为你应该在每个日志消息后清空写入器(以确保写入磁盘),不用担心释放它。让 JVM 关闭所有东西。除非你正在编写大量线程并且打开了很多文件。然后你可能只想同时打开'n'个写入器,并在不记录日志时关闭一些写入器。然而,这可能会导致一些抖动 :-) - Brian Agnew
原来我只需要从记录器中移除附加器(Logger.removeAppender()),然后通过调用Appender.close()关闭它。非常简单! - Edward Q. Bridges

1

在log4j中这是不可能的,至少不容易实现。但是,如果你看一下logback(log4j的后继者)中提供的SiftingAppender,它被设计用于根据运行时条件创建和删除appenders。

如果你的应用程序每次启动只需要创建一个日志文件,那么你可以基于时间戳简单地命名你的日志文件。如果需要进一步帮助,请在logback-user邮件列表上发帖求助。


我很好奇为什么这不可能。它似乎相对简单。我已经在logback-user上发布了一个帖子进行了跟进。希望你能在那里找到并详细说明。谢谢! - Edward Q. Bridges
这取决于您是希望通过编程方式还是配置文件来配置自定义appender。在多线程应用程序中,还有一个管理日志文件(每个线程一个)的问题。原始问题对这两个问题没有非常具体的说明。 - Ceki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接