缓冲记录器(Java)

IAm*_*aja 4 java logging log4j

我正在考虑构建一个日志系统,将日志语句推送到内部缓冲区,直到达到预定义的容量,然后立即转储(刷新)整个缓冲区.

这是因为我喜欢在我的方法中撒上大量的TRACE语句(所以我可以看到每几行都会发生什么;让它更容易调试,至少对我而言).而且我害怕(可能)数百/数千个日志语句在整个地方触发,这样一个大的I/O需求会使我的程序陷入困境.

"缓冲"记录器解决方案可能会缓解这个问题.

三个问题:

  1. 这样的事情已经存在吗?讨厌在这里重新发明轮子,但在线搜索没有回头任何事情.
  2. 我正在考虑这样一个事实:只要程序意外停止(运行时异常等)并且记录器没有被刷新,我就可以很好地丢失日志语句.在这种情况下,我希望记录器覆盖finalize(),这样如果程序终止仍然在其缓冲区中的项目,它可以在退出之前刷新(发布)它们.思考?
  3. 这是一个糟糕的主意吗?如果是这样,为什么!

Mat*_*ell 5

如果你可以避免它,不要重新发明这个特定的轮子.看看Log4j或更好的slf4j.

如果您没有跟踪,Log4j和slf4j都非常高效,因此在生产系统中您可以降低日志记录级别并仍然具有良好的性能.

log4j和slf4j都会立即写入日志文件并刷新,默认情况下不进行缓冲,这是因为您希望在日志文件中看到导致崩溃的异常.如果你真的想添加缓冲,你可以这样做(FileAppender#bufferedIO)

就finalize()而言,不保证在退出时调用它.来自System#runFinalizersOnExit.

已过时.这种方法本质上是不安全的.它可能导致在活动对象上调用终结器,而其他线程同时操作这些对象,从而导致不稳定的行为或死锁.退出时启用或禁用完成; 这样做指定在Java运行时退出之前运行具有尚未自动调用的终结器的所有对象的终结器.默认情况下,退出时终止已禁用.

我的重点.所以,似乎缓冲记录器似乎没有固有的问题.