Logback FileAppender是否未同步?同步逻辑是否在其他位置?
Logback FileAppender的同步逻辑说明
你的观察没错:FileAppender的继承链确实是FileAppender → OutputStreamAppender → UnsynchronizedAppenderBase,这两个父类本身没有内置同步处理逻辑——UnsynchronizedAppenderBase从名字就能看出来,就是专门设计成不自带锁的,目的是给性能敏感的场景减少不必要的同步开销。
但Logback的线程安全保障并没有缺失,同步逻辑主要在这几个地方:
- 底层输出流的线程安全:默认情况下
FileAppender使用的FileOutputStream,其write方法是线程安全的(Java标准库原生实现),能保证多个线程写入时字节不会交错、丢失,但这种同步只能保证字节层面的安全,没法保证整条日志不被拆分(比如一个日志条目可能被切成几段和其他线程的日志混在一起)。 - 显式同步包装:如果需要保证日志条目作为一个整体原子性写入,可以用
SyncAppenderWrapper把FileAppender包装起来。这个包装类会在append方法上加锁,确保每个日志事件被完整编码并写入后,才会处理下一个事件。 - 自定义同步控制:如果是自己实现的输出流,或者业务场景有特殊需求,也可以在调用Logger的层面做同步,或者自定义Appender添加锁逻辑。
简单说:FileAppender本身不做同步,但你可以通过底层流、包装类或者上层控制来实现线程安全的日志写入。
内容的提问来源于stack exchange,提问作者김민식
相关产品推荐
相关产品推荐

