【问题标题】:Java Util Logger Write SynchronizationJava Util Logger 写入同步
【发布时间】:2013-01-08 09:16:02
【问题描述】:

通常在应用程序中(以 Web 应用程序为例),我们在启动期间创建了一个记录器实例。它甚至可以是一个单例,这并不重要。重要的是整个应用程序有 1 个实例。我们使用 java.util.logger

现在想象一下,您有来自两个不同用户的两个请求,它们引发了异常,我们正在记录那些被写入日志文件的请求。这两个不同请求中对日志文件的写入是否以某种方式同步?或者我们是否需要显式同步它们,因为我发现在极少数情况下我们得到的日志都混合在 tomcat 日志文件中的两个请求之间?

我并不完全关心这里的因果关系,只是将两条日志消息分开。

【问题讨论】:

  • 如果您在 2 个连续语句中调用日志两次,就会发生混淆的事情。然后不再保证原子性。
  • 肯定不会出现在两个连续的语句中。它发生在代码不同部分的不同请求上
  • 当我说混合时,我的意思不是一个被另一个截断,而是交错

标签: java logging synchronization java.util.logging


【解决方案1】:

你不需要任何同步,引用JavaDoc of Logger

Logger 上的所有方法都是多线程安全的。

请注意,来自不同线程的单独调用仍然可以交错。这只是意味着您不会让一条消息被另一条消息打断和分割。

【讨论】:

  • 但这保证也适用于 appender 吗?
  • @radai:你的意思是处理程序?我找不到参考,但我很确定它们也是安全的。你能举个例子,你所说的“mixed up”是什么意思?
  • 当我说混合时,我并不是指一个被另一个截断,而是交错
  • @SaiVenkat:日志消息按照发出的顺序打印/保存。这意味着如果线程上下文切换,来自不同线程的日志将交错。换句话说,日志消息总是按时间排序,而不是按线程
  • 所以你的意思是有因果关系的保证?
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2018-04-17
相关资源
最近更新 更多