Fessでは以前からクロール完了やOpenSearchの状態検知をSlackやGoogle Chat、メールで通知する機能がありましたが、ERROR/WARNレベルのログを通知する機能はありませんでした。運用中にエラーが発生した際に、ログファイルを見ないと気づけないという課題があったので、ログ通知機能を追加しました。
概要
この機能は、Fessのメインプロセスだけでなく、クローラー、サジェスト、サムネイルのサブプロセスで発生したERROR/WARNログを収集し、Slack、Google Chat、メールに通知します。各プロセスのログイベントはLog4j2のカスタムAppenderで捕捉され、インメモリバッファに蓄積した後、OpenSearchのキューインデックスに書き込まれます。その後、定期実行ジョブがキューから読み取り、既存の通知インフラを通じて通知を送信する仕組みです。
設定方法
管理画面での有効化
管理画面の「全般」設定に「ログ通知」のチェックボックスが追加されています。これを有効にするだけで、ログ通知が機能します。デフォルトでは無効になっています。
通知先の設定
通知先はFessの既存の通知設定を利用します。管理画面の「全般」設定で、SlackのWebhook URLやGoogle ChatのWebhook URL、メール設定を行ってください。以前のSlack通知の記事で紹介した設定と同じです。
通知レベルの設定
デフォルトではERRORレベルのみが通知対象です。WARNレベルも含めたい場合は、system.propertiesで以下のように設定できます。
log.notification.level=WARN
その他の設定項目
fess_config.propertiesで以下の項目をカスタマイズできます。
# バッファに蓄積できる最大イベント数(デフォルト: 1000)
log.notification.buffer.size=1000
# OpenSearchへのフラッシュ間隔(ミリ秒、デフォルト: 30000 = 30秒)
log.notification.flush.interval=30000
# 通知に表示する最大イベント数(デフォルト: 50)
log.notification.max.display.events=50
# メッセージの最大長(デフォルト: 200)
log.notification.max.message.length=200
仕組み
ログ通知は以下のコンポーネントで構成されています。
- LogNotificationAppender: Log4j2のカスタムAppenderで、ERROR/WARNログイベントを捕捉してバッファに蓄積します。無限ループを防ぐために、通知処理自体のログは除外されます
- LogNotificationHelper: インメモリバッファの管理とライフサイクルを担当します
- LogNotificationTarget: TimeoutTargetの実装で、30秒ごとにバッファの内容をOpenSearchのキューインデックスにフラッシュします
- LogNotificationJob: 5分ごとに実行されるスケジュールジョブで、OpenSearchのキューからイベントを読み取り、レベルごとにグループ化して通知を送信します
複数インスタンスで運用している場合も、ホスト名ベースでフィルタリングされるため、各インスタンスのログが正しく区別されます。
まとめ
この機能により、Fessの運用中に発生したエラーをリアルタイムに近い形で把握できるようになります。ログ監視の仕組みを別途構築する必要がなくなるので、小規模な環境や手軽に通知を受けたい場合に便利です。