Class SynchronousFileLogWriter

All Implemented Interfaces:
LogWriter

public class SynchronousFileLogWriter extends FileLogWriter
ロックファイルを用いて排他制御を行いながらファイルにログを書き込むクラス。

本クラスを使用するとプロセスをまたがってログ出力処理を直列化できるので、複数プロセスから同一のファイルにログ出力を行う場合でも確実にログを出力できる。
本クラスは障害通知ログのように出力頻度が低く、かつサーバ単位でログファイルを一元管理するほうが効率的なログの出力にのみ使用することを想定している。 頻繁にログの出力が行われる場面で本クラスを使用するとロック取得待ちによって性能が劣化する可能性があるので、 アプリケーションログやアクセスログのように出力頻度の高いログの出力に本クラスを使用してはいけない。

本クラスはロック取得の待機時間を超えてもロックを取得できない場合、 強制的にロックファイルを削除し、ロックファイルを生成してからログの出力を行う。
もし強制的にロックファイルを削除できない場合は、ロックを取得していない状態で強制的にログの出力を行い、処理を終了する。
また、ロックファイルの生成に失敗した場合および、ロック取得待ちの際に割り込みが発生した場合も、ロックを取得していない状態で強制的にログの出力を行い、処理を終了する。

Author:
Masato Inoue
  • Constructor Details

    • SynchronousFileLogWriter

      public SynchronousFileLogWriter()
  • Method Details

    • onInitialize

      protected void onInitialize(ObjectSettings settings)
      初期処理を行う。
      ログの出力先に応じたリソースの確保などを実装する。
      デフォルト実装では何もしない。

      プロパティファイルで指定された設定情報を取得し、ファイルへの書き込みを行う出力ストリームを初期化する。
      初期処理完了後、INFOレベルで設定情報を出力する。

      Overrides:
      onInitialize in class FileLogWriter
      Parameters:
      settings - LogWriterの設定内容
    • getSettings

      protected String getSettings()
      設定情報を取得する。

      設定情報のフォーマットを下記に示す。

       
       WRITER NAME        = [<{@link LogWriter}の名称>]
       WRITER CLASS       = [<{@link LogWriter}のクラス名>]
       FORMATTER CLASS    = [<{@link LogFormatter}のクラス名>]
       LEVEL              = [<ログの出力制御の基準とするLogLevel>]
       FILE PATH          = [<書き込み先のファイルパス>]
       ENCODING           = [<書き込み時に使用する文字エンコーディング>]
       OUTPUT BUFFER SIZE = [<出力バッファのサイズ>]
       FILE AUTO CHANGE   = [<ログファイルを自動で切り替えるか否か。>]
       MAX FILE SIZE      = [<書き込み先ファイルの最大サイズ>]
       CURRENT FILE SIZE  = [<書き込み先ファイルの現在のサイズ>]
       LOCK FILE PATH                      = [<ロックファイルのパス>]
       LOCK RETRY INTERVAL                 = [<ロック取得の再試行間隔(ミリ秒)>]
       LOCK WAIT TIME                      = [<ロック取得の待機時間(ミリ秒)>]
       FAILURE CODE CREATE LOCK FILE       = [<生成したロックファイルを削除できない場合の障害コード>]
       FAILURE CODE RELEASE LOCK FILE      = [<生成したロックファイルを解放(削除)できない場合の障害コード>]
       FAILURE CODE FORCE DELETE LOCK FILE = [<解放されないロックファイルを強制削除できない場合の障害コードド>]
       FAILURE CODE INTERRUPT LOCK WAIT    = [<ロック待ちでスレッドをスリープしている際に、割り込みが発生した場合の障害コード>]
       
       
      Overrides:
      getSettings in class FileLogWriter
      Returns:
      設定情報
      See Also:
    • write

      public void write(LogContext context)
      フォーマット済みのログを出力先に書き込む。

      設定でLogLevelが指定されている場合は、有効なレベルの場合のみLogWriterSupport.onWrite(String)メソッドを呼び出す。
      有効なレベルのログでない場合は、何も処理しない。
      Specified by:
      write in interface LogWriter
      Overrides:
      write in class LogWriterSupport
      Parameters:
      context - LogContext
    • onWrite

      protected void onWrite(String formattedMessage, LogContext context)
      ロックファイルを使用して排他制御を行いながらファイルにログ書き込みを行う。

      排他制御の仕様を以下に示す。

      • ロックファイルの生成に成功した場合、ログ書き込みを行い、ロックファイルを削除する。
      • ファイルパス不正などでロックファイルの生成に失敗した場合、引数で渡されたメッセージとロックファイルが作成できなかった旨のメッセージを、強制的にログファイルに出力する。
      • 既にロックファイルが存在するためにロックファイルの生成に失敗した場合、一定時間処理をスリープさせ、再試行する。
      • ロック取得待機時間を超えてもロックファイルを生成できなかった場合、不要なロックファイルが残存しているとみなしロックファイルを削除し、再度ロックファイルの生成を試みる。 もしロックファイルの削除に失敗した場合、引数で渡されたメッセージとロックファイルの削除に失敗した旨のメッセージを、強制的にログファイルに出力する。
      • ロック取得待ちの際に割り込みが発生した場合、引数で渡されたメッセージと割り込みが発生した旨のメッセージを、強制的にログファイルに出力する。
      Parameters:
      formattedMessage - フォーマット済みのログ
      context - ログエントリオブジェクト
    • lockFile

      protected boolean lockFile(String formattedMessage, LogContext context)
      ロックファイルを作成し、ログファイルをロックする。
      Parameters:
      formattedMessage - フォーマット済みのログ
      context - ログエントリオブジェクト
      Returns:
      ロックファイルの作成結果(true:成功 false:失敗)
    • waitLock

      protected boolean waitLock(File lockFile, String formattedMessage, LogContext context)
      ロック待ち処理を行う。

      ロック取得の再試行間隔(ミリ秒)で設定された時間、スレッドをスリープさせる。

      Parameters:
      lockFile - ロックファイル
      formattedMessage - フォーマット済みのログ
      context - ログエントリオブジェクト
      Returns:
      もし割り込みが発生した場合にはfalse
    • deleteLockFileExceedsLockWaitTime

      protected boolean deleteLockFileExceedsLockWaitTime(File lockFile, String formattedMessage, LogContext context)
      待機時間を過ぎても残存しているロックファイルを強制的に削除する。
      Parameters:
      lockFile - ロックファイル
      formattedMessage - フォーマット済みのログ
      context - ログエントリオブジェクト
      Returns:
      ロックファイルの強制削除が正常に終了したかどうか
    • forceWrite

      protected void forceWrite(String formattedMessage, LogContext context, String lockErrorMessage)
      ロック取得に失敗した場合に、強制的にログ出力を行う。
      Parameters:
      formattedMessage - フォーマット済みのログ
      context - ログエントリオブジェクト
      lockErrorMessage - ロック取得に失敗した原因のログ
    • releaseLock

      protected void releaseLock(String formattedMessage, LogContext context)
      ログ出力後に、ロックを解放する。

      ロックの解放処理は、ロックファイルを削除することによって行う。

      Parameters:
      formattedMessage - フォーマット済みのログ(本メソッドでは使用していない)
      context - ログエントリオブジェクト