使用AsyncAppender的日志记录存储是否保证按时间顺序排列?

时间:2014-06-30 15:18:30

标签: java logging slf4j logback

假设我使用logger.info记录两个事件,其中logger被声明为private static Logger logger = LoggerFactory.getLogger(SomeClass.class);,并且这两个事件的间隔小于1毫秒。

我想知道后一个事件(即稍后记录器的事件)是否总是在存储的RollingFileAppender中的前一个事件之后?我将ch.qos.logback.core.rolling.TimeBasedRollingPolicyAsyncAppender一起使用。

2 个答案:

答案 0 :(得分:3)

AsyncAppender使用BlockingQueue实施。 Logger将向队列添加日志记录事件,并且单个工作程序Thread将从队列中获取并处理日志记录。

如果您的代码按时间顺序(通过锁定或其他机制)保证这些顺序,那么它们也可以保证在日志中订购。

答案 1 :(得分:1)

如果您使用相同的记录器实例编写多个线程,则无法保证订购。

查看logback Logger implementation

此方法内没有同步。 thread1可能会调用logger.info(“1”),片刻之后thread2会调用logger.info(“2”),但是appender会在“1”之前收到“2”。

如果您需要订购保证,您必须自己同步调用logger.info()。