FessのログをSlackやGoogle Chatに通知する

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

仕組み

ログ通知は以下のコンポーネントで構成されています。

  1. LogNotificationAppender: Log4j2のカスタムAppenderで、ERROR/WARNログイベントを捕捉してバッファに蓄積します。無限ループを防ぐために、通知処理自体のログは除外されます
  2. LogNotificationHelper: インメモリバッファの管理とライフサイクルを担当します
  3. LogNotificationTarget: TimeoutTargetの実装で、30秒ごとにバッファの内容をOpenSearchのキューインデックスにフラッシュします
  4. LogNotificationJob: 5分ごとに実行されるスケジュールジョブで、OpenSearchのキューからイベントを読み取り、レベルごとにグループ化して通知を送信します

複数インスタンスで運用している場合も、ホスト名ベースでフィルタリングされるため、各インスタンスのログが正しく区別されます。

まとめ

この機能により、Fessの運用中に発生したエラーをリアルタイムに近い形で把握できるようになります。ログ監視の仕組みを別途構築する必要がなくなるので、小規模な環境や手軽に通知を受けたい場合に便利です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です