2009-08-06 57 views
5

我有一个遗留的PSVM应用程序,我希望将其日志记录输出重定向到每次执行的唯一文件。因此,如果我在10:00调用它,请将其输出重定向到{thread-id} -10:00.log;另一个执行线程可能在10:01开始执行,其输出将转到{thread-id} -10:01.log。我明白这不是优雅的。动态创建和销毁日志appender

我的问题是:

  • 这可能吗?
  • 有人有一个想法如何处理?
  • 是否有可能释放/摧毁一个appender,当它不再需要?

谢谢!

回答

4

我会从FileAppender开始,并从中创建你自己的。只需修改您的版本即可获取当前的线程ID,并在创建之前为文件附加适当的线程ID /时间戳。你会保持(说)在线程ID上键入的(缓冲)FileWriters的地图。

写作appenders是相当微不足道 - here's a Javaworld guide如何做到这一点。

在上述内容中,您的程序是否有可能在一分钟内启动两次?你想附加一个进程ID或类似的维护唯一性?

+0

感谢您的快速回答!一个线程不会多次执行它。但是,无论如何,这只是一个讨论的例子。该名称将被限定为唯一性。 关于如何释放文件编写器的任何想法? – 2009-08-06 14:41:55

+0

+1好教程链接 – WolfmanDragon 2009-08-06 14:52:22

+0

Re。释放。我认为你应该在每条日志消息之后刷新作者(以确保写入磁盘),并且不用担心将其释放。让JVM把一切都放下。除非你写了很多线程并且打开了很多文件。那么你可能只想让'n'作家立即打开,并在没有登录时关闭一些作家。这可能会导致一些颠簸,但是:-) – 2009-08-06 15:13:03

1

这是不可能的,至少在log4j中不容易做到。然而,如果你看看SiftingAppender与logback(log4j的后继者)一起发货,它被设计为处理在运行时标准上创建appender以及在不再需要时删除appender。

如果您的应用程序需要为每个应用程序启动创建一个日志文件,您可以简单地根据时间戳命名您的日志文件。如果您需要进一步的帮助,请在logback-user邮件列表上留言。

+0

我很想知道为什么这是不可能的。这似乎相对简单。我跟进了一篇发布到logback-user的文章。我希望你能在那里找到并详细说明。谢谢! – 2009-08-07 20:32:08

+0

这取决于您是否希望以编程方式或通过配置文件配置自定义appender。还有在多线程应用程序中管理日志文件(每个线程一个)的问题。 对于这两个问题,原始问题并不是非常具体。 – Ceki 2009-08-07 20:50:35