Fessのスクリプト監査ログの改善

Fessでは、スクリプトの実行内容をaudit.logに出力する機能がありますが、実際に運用してみると、ログが長すぎて扱いにくいという問題がありました。今回、スクリプト監査ログの最大長を設定可能にし、あわせて文字列の正規化処理の順序も修正しました。

問題点

以前の実装では、スクリプトの監査ログに記録されるテキストの最大長が1000文字にハードコードされていました。スクリプトの実行内容をaudit.logに出力するようにしていましたが、ログが長くなりすぎて確認しづらく、実用的ではありませんでした。

また、文字列の正規化処理の順序にも問題がありました。制御文字(改行、タブなど)の置換を先に行ってから切り詰めていたため、切り詰め位置を超えた部分の制御文字まで不要に処理されていました。

改善内容

最大長の設定プロパティ追加

fess_config.propertiesscript.audit.log.max.lengthプロパティを追加し、監査ログに記録するスクリプトテキストの最大長を設定できるようにしました。デフォルト値は100です。

# スクリプト監査ログの最大長(デフォルト: 100)
script.audit.log.max.length=100

以前のデフォルト値1000文字で運用していた環境では、必要に応じて明示的に設定してください。

script.audit.log.max.length=1000

正規化処理の順序修正

ActivityHelper.normalizeScript()メソッドで、処理の順序を変更しました。

変更前: 制御文字の置換 → 切り詰め
変更後: 切り詰め → 制御文字の置換

これにより、切り詰め位置を超えた部分の制御文字に対する不要な処理がなくなり、効率的になりました。

GroovyEngineの最適化

GroovyEngineでは、監査ログが無効な場合の早期リターンを追加しました。初期化時にscriptAuditLogEnabledフラグをキャッシュしておくことで、監査ログが無効な場合はlogScriptExecution()メソッドで無駄な処理を行わずに即座にリターンします。また、getCurrentScheduledJob()でのnullチェックも追加しています。

まとめ

スクリプトの実行内容をaudit.logに出力する機能自体は便利ですが、実際に使ってみると、ログが長すぎて扱いにくいという問題がありました。今回の改善で、最大長を環境に合わせて設定できるようになり、処理効率も向上しました。この変更はFess 15.6.0で利用可能になる予定です。

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

Fessの管理画面の全般設定で設定可能な項目を拡充 

Fessの管理画面にある「全般」設定ページで設定できる項目を大幅に増やしました。これまでsystem.propertiesファイルを直接編集する必要があった設定を、管理画面から変更できるようにしています。

背景

Fessでは、system.propertiesで多くの設定項目を管理していますが、すべてが管理画面から設定できるわけではありませんでした。設定を変更するためにサーバー上のファイルを直接編集する必要があり、運用の手間が発生していました。今回、管理画面の全般設定に45項目を追加し、ほぼすべての設定をブラウザから変更できるようにしました。

追加した設定項目

各セクションに追加した項目は以下の通りです。

システム設定

  • 検索ファイルプロキシ: ファイルプロキシの有効/無効
  • ブラウザロケール使用: 検索時にブラウザのロケールを使用するかどうか
  • SSOタイプ: SSO認証方式の選択(none、oic、saml、spnego、entraid)

クローラー設定

  • User Agent: クローリング時に使用するユーザーエージェント文字列

LDAP設定

  • Security Authentication: LDAP認証タイプ
  • Initial Context Factory: LDAPコンテキストファクトリのクラス名

通知設定

  • 詳細検索ページ通知: 詳細検索ページに表示する通知メッセージ
  • Slack Webhook URL: Slack通知用のWebhook URL
  • Google Chat Webhook URL: Google Chat通知用のWebhook URL

OpenID Connect設定(新規セクション)

クライアントID、クライアントシークレット、認証サーバーURL、トークンサーバーURL、リダイレクトURL、スコープ、ベースURL、デフォルトグループ、デフォルトロールの9項目を設定できます。

SAML設定(新規セクション)

SPベースURL、グループ属性名、ロール属性名、デフォルトグループ、デフォルトロールの5項目を設定できます。

SPNEGO設定(新規セクション)

Kerberos設定ファイルパス、ログイン設定ファイルパス、クライアント/サーバーモジュール名、事前認証のユーザー名/パスワード、Basic認証やNTLMプロンプトの有効/無効、localhost許可、委任許可、除外ディレクトリの12項目を設定できます。

Entra ID設定(新規セクション)

クライアントID、クライアントシークレット、テナントID、Authority URL、Reply URL、State TTL、デフォルトグループ、デフォルトロール、パーミッションフィールド、ドメインサービス利用の10項目を設定できます。

セキュリティへの配慮

クライアントシークレットやパスワードなどの機密情報は、管理画面上ではマスク表示(**********)されます。値が設定済みかどうかは確認でき、新しい値を入力して更新することも可能ですが、現在の値がそのまま表示されることはありません。

まとめ

今回の変更により、SSO関連の設定を含む45項目が管理画面から設定可能になりました。サーバー上のファイルを直接編集する必要がなくなるため、運用の効率化が期待できます。

関連リンク