2013-02-18 49 views
4

在Logback中,我们可以配置为:1当日志文件的大小达到50MB时,旋转文件并对其进行压缩。所以我想知道它会在一个单独的线程中执行压缩的东西,它会有任何性能问题?在Logback中压缩日志文件的单独线程?

回答

5

我调查了logback-1.0.3。 让我们考虑用例:

  1. 您在代码中调用Logger#error(String)
  2. 您的数据filtered根据记录器配置。
  3. 后会buildLoggingEventAndAppendcallApenders
  4. 在你的情况下调用Appenders将调用append方法在OutputStreamAppender
  5. 当事件触发时,基于触发的RollingFileAppender将调用rollover
  6. 在翻转方法将调用appropriate compress method

正如你所看到的,所有东西都将被记录并压缩在与记录数据相同的线程中。因此你不应该登录时间关键的线程。我个人认为,登录同一个线程对于大多数应用程序来说并不重要,但它很大程度上取决于你的环境,性能要求,e.t.c。

如果要异步记录数据,可以使用AsyncAppender。在这种情况下,压缩也将在单独的线程中。

+1

也许在同一个线程中调用compress方法的可能解决方案之一就是使用一个异步appender ... – 2013-02-18 11:23:52

+0

@AdamDyga你是对的。这是这个问题的法律解决方法。 – Taky 2013-02-18 11:45:34

+0

logback doc说异步appender使用固定大小的阻塞队列,并且如果队列开始填满(压缩大文件时可能会发生),则会在INFO级别和以下级别放置消息(您可以调整或禁用此选项)。如果队列一直填满,调用线程会阻​​塞,所以行为会再次实现有效同步。您可能能够调整队列大小和文件大小以避免这种情况。 – 2015-09-03 18:05:21