Javaのsynchronizedは順序を保証しない。

あああ、という内容ではあるのですが、

synchronizedは複数同時に入ろうとしてロックがかかった時に順序を保証しません。
おかげで、logback1.1.2のRollingFileAppenderを使用していると、日付が変更されたときにログの順番が入れ替わってしまう事がある。

RollingFileAppenderの174行目あたりが原因らしい。

    /**
   * This method differentiates RollingFileAppender from its super class.
   */
  @Override
  protected void subAppend(E event) {
    // The roll-over check must precede actual writing. This is the
    // only correct behavior for time driven triggers.

    // We need to synchronize on triggeringPolicy so that only one rollover
    // occurs at a time
    synchronized (triggeringPolicy) {
      if (triggeringPolicy.isTriggeringEvent(currentlyActiveFile, event)) {
        rollover();
      }
    }

    super.subAppend(event);
  }

順序を入れ替えたくない場合は、java.util.concurrent.locks.ReentrantLockjava.util.concurrent.Semaphoreのコンストラクタの引数としてtrueを渡して使いましょう。

さて、どうするかなぁ・・・・・・