public class SynchronousFileLogWriter extends FileLogWriter
本クラスを使用するとプロセスをまたがってログ出力処理を直列化できるので、複数プロセスから同一のファイルにログ出力を行う場合でも確実にログを出力できる。
本クラスは障害通知ログのように出力頻度が低く、かつサーバ単位でログファイルを一元管理するほうが効率的なログの出力にのみ使用することを想定している。
頻繁にログの出力が行われる場面で本クラスを使用するとロック取得待ちによって性能が劣化する可能性があるので、
アプリケーションログやアクセスログのように出力頻度の高いログの出力に本クラスを使用してはいけない。
本クラスはロック取得の待機時間を超えてもロックを取得できない場合、
強制的にロックファイルを削除し、ロックファイルを生成してからログの出力を行う。
もし強制的にロックファイルを削除できない場合は、ロックを取得していない状態で強制的にログの出力を行い、処理を終了する。
また、ロックファイルの生成に失敗した場合および、ロック取得待ちの際に割り込みが発生した場合も、ロックを取得していない状態で強制的にログの出力を行い、処理を終了する。
Constructor and Description |
---|
SynchronousFileLogWriter() |
Modifier and Type | Method and Description |
---|---|
protected boolean |
deleteLockFileExceedsLockWaitTime(java.io.File lockFile,
java.lang.String formattedMessage,
LogContext context)
待機時間を過ぎても残存しているロックファイルを強制的に削除する。
|
protected void |
forceWrite(java.lang.String formattedMessage,
LogContext context,
java.lang.String lockErrorMessage)
ロック取得に失敗した場合に、強制的にログ出力を行う。
|
protected java.lang.String |
getSettings()
設定情報を取得する。
設定情報のフォーマットを下記に示す。 |
protected boolean |
lockFile(java.lang.String formattedMessage,
LogContext context)
ロックファイルを作成し、ログファイルをロックする。
|
protected void |
onInitialize(ObjectSettings settings)
初期処理を行う。
ログの出力先に応じたリソースの確保などを実装する。 デフォルト実装では何もしない。 |
protected void |
onWrite(java.lang.String formattedMessage,
LogContext context)
ロックファイルを使用して排他制御を行いながらファイルにログ書き込みを行う。
排他制御の仕様を以下に示す。
ロックファイルの生成に成功した場合、ログ書き込みを行い、ロックファイルを削除する。
ファイルパス不正などでロックファイルの生成に失敗した場合、引数で渡されたメッセージとロックファイルが作成できなかった旨のメッセージを、強制的にログファイルに出力する。
既にロックファイルが存在するためにロックファイルの生成に失敗した場合、一定時間処理をスリープさせ、再試行する。
ロック取得待機時間を超えてもロックファイルを生成できなかった場合、不要なロックファイルが残存しているとみなしロックファイルを削除し、再度ロックファイルの生成を試みる。
もしロックファイルの削除に失敗した場合、引数で渡されたメッセージとロックファイルの削除に失敗した旨のメッセージを、強制的にログファイルに出力する。
ロック取得待ちの際に割り込みが発生した場合、引数で渡されたメッセージと割り込みが発生した旨のメッセージを、強制的にログファイルに出力する。
|
protected void |
releaseLock(java.lang.String formattedMessage,
LogContext context)
ログ出力後に、ロックを解放する。
ロックの解放処理は、ロックファイルを削除することによって行う。
|
protected boolean |
waitLock(java.io.File lockFile,
java.lang.String formattedMessage,
LogContext context)
ロック待ち処理を行う。
ロック取得の再試行間隔(ミリ秒)で設定された時間、スレッドをスリープさせる。
|
void |
write(LogContext context)
フォーマット済みのログを出力先に書き込む。
設定で LogLevel が指定されている場合は、有効なレベルの場合のみLogWriterSupport.onWrite(String) メソッドを呼び出す。有効なレベルのログでない場合は、何も処理しない。 |
onTerminate, onWrite
createLogFormatter, getFormatter, getName, initialize, needsToWrite, terminate
protected void onInitialize(ObjectSettings settings)
onInitialize
in class FileLogWriter
settings
- LogWriter
の設定内容protected java.lang.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 = [<ロック待ちでスレッドをスリープしている際に、割り込みが発生した場合の障害コード>]
getSettings
in class FileLogWriter
FileLogWriter.getSettings()
,
LogLevel
public void write(LogContext context)
LogLevel
が指定されている場合は、有効なレベルの場合のみLogWriterSupport.onWrite(String)
メソッドを呼び出す。write
in interface LogWriter
write
in class LogWriterSupport
context
- LogContext
protected void onWrite(java.lang.String formattedMessage, LogContext context)
formattedMessage
- フォーマット済みのログcontext
- ログエントリオブジェクトprotected boolean lockFile(java.lang.String formattedMessage, LogContext context)
formattedMessage
- フォーマット済みのログcontext
- ログエントリオブジェクトprotected boolean waitLock(java.io.File lockFile, java.lang.String formattedMessage, LogContext context)
lockFile
- ロックファイルformattedMessage
- フォーマット済みのログcontext
- ログエントリオブジェクトprotected boolean deleteLockFileExceedsLockWaitTime(java.io.File lockFile, java.lang.String formattedMessage, LogContext context)
lockFile
- ロックファイルformattedMessage
- フォーマット済みのログcontext
- ログエントリオブジェクトprotected void forceWrite(java.lang.String formattedMessage, LogContext context, java.lang.String lockErrorMessage)
formattedMessage
- フォーマット済みのログcontext
- ログエントリオブジェクトlockErrorMessage
- ロック取得に失敗した原因のログprotected void releaseLock(java.lang.String formattedMessage, LogContext context)
formattedMessage
- フォーマット済みのログ(本メソッドでは使用していない)context
- ログエントリオブジェクト