はじめに
本記事の目的:Datadogのログ監視で、日本語文字列かつ文中にスペースを含む、複数のエラーログをフィルタリングによって正しく除外できるかどうかを検証します。
背景:本番環境にて特定の日本語ログが大量に出力されており、Datadog上でのノイズとなっていました。これらのログは文中にスペースを含む日本語で、複数のメッセージパターンがありました。Datadog公式ドキュメントには、英数字ベースの例のみが記載されていたため、本番環境のログの条件でフィルタリングが正常にできるかを確認します。
環境
- EC2
- OS:Amazon Linux 2023
- 監視対象ログファイル:
/var/log/test-log.log
- 監視対象文字:
・ターゲットはログイン要求に時間内に応答できませんでした。
・イニシエーターは iSCSI PDU を送信できませんでした。ダンプ データにエラー状態が示されています。
・ターゲットは NOP 要求に時間内に応答できませんでした。 - 検証方法:ログファイルへ手動でログを追記し、Datadog Agent経由でログが収集されるかを確認します。
実践
ログファイルの保存先を作成
- Datadog Agentに読ませるログファイルを配置するディレクトリを作成します。任意の場所で問題ありません。
sudo mkdir /var/log/
ログ収集設定用ディレクトリの作成
- Datadog Agentにカスタムログの収集ルールを認識させるため、設定ファイル専用ディレクトリを作成します。
- Datadog Agentは構成ディレクトリのルートにある
conf.d/
配下に<任意名>.d/conf.yam
lを配置することで、そのログ設定を認識します。 - 今回はLinux環境下なので、
/etc/datadog-agent/conf.d/
配下に<任意名>.d/conf.yam
lを配置します。ここではtestlog.d
とします。
sudo mkdir /etc/datadog-agent/conf.d/testlog.d
カスタムログ収集
Datadog Agent v6 は、収集したログをファイル、ネットワーク (TCP または UDP)、journald、Windows チャンネルから Datadog に転送できます。
1.Agent の構成ディレクトリのルートにあるconf.d/
ディレクトリに、Datadog ユーザーがアクセスできる新しいフォルダを作成します。この新しいフォルダーに新しい
.d/ conf.yaml
ファイルを作成します。
conf.yamlの設定
- 以下の内容で設定ファイルを作成します。今回は、
exclude_at_match
を使って、特定のエラーログを除外する構成です。 - 本番環境では、一部の日本語エラーログにの文中にスペースが含まれているケースが見受けられたため、今回の検証では空白を含む複数の日本語エラーメッセージを
exclude_at_match
に指定し、Datadog Agentが正常に除外できるかを確認します。 path:
は、Datadog Agentが監視・収集するログファイルの場所を指定します。先ほど作成した/var/log/
ディレクトリ配下に任意のログファイルを指定します。今回はtest-log.log
を配置します。
sudo cat /etc/datadog-agent/conf.d/testlog.d/conf.yaml init_config: logs: - type: file path: /var/log/test-log.log service: test-log source: custom sourcecategory: test log_processing_rules: - type: exclude_at_match name: exclude_log pattern: ターゲットはログイン要求に時間内に応答できませんでした。|イニシエーターは iSCSI PDU を送信できませんでした。ダンプ データにエラー状態が示されています。|ターゲットは NOP 要求に時間内に応答できませんでした。
Datadog Agentを再起動
- 設定を反映させるためにAgentを再起動します。
sudo systemctl restart datadog-agent
構文エラーがないか確認
configcheck
で構文エラーがないことを確認します。
sudo datadog-agent configcheck ...(省略) === test-log check === Configuration provider: file Configuration source: file:/etc/datadog-agent/conf.d/test-log.d/conf.yaml Log Config: logs: - log_processing_rules: - name: exclude_error_log pattern: ターゲットはログイン要求に時間内に応答できませんでした。|イニシエーターは iSCSI PDU を送信できませんでした。ダンプ データにエラー状態が示されています。|ターゲットは NOP 要求に時間内に応答できませんでした。 type: exclude_at_match path: /var/log/test-log.log service: test-log source: custom sourcecategory: test type: file === ...(省略)
Datadog Agentのログ収集機能を有効化
- Datadog Agentのメイン設定ファイル
/etc/datadog-agent/datadog.yaml
を編集し、ログ収集機能を有効にします。 - デフォルトは
logs_enabled: false
に設定されています。
sudo cat /etc/datadog-agent/datadog.yaml ...(省略) ################################## ## Log collection Configuration ## ################################## ## @param logs_enabled - boolean - optional - default: false ## @env DD_LOGS_ENABLED - boolean - optional - default: false ## Enable Datadog Agent log collection by setting logs_enabled to true. # logs_enabled: true ...(省略)
Datadog Agentを再起動
- 設定を反映させるためにAgentを再起動します。
sudo systemctl restart datadog-agent
ログファイルにテストログを書き込む
- Datadog Agentがログファイル
/var/log/test-log.log
を監視し、exclude_at_match
で指定した文字列を除外しているかを確認します。 exclude_at_match
で指定した文字列と、指定していない文字列をログファイルに書き込むことで、フィルタリングが正常に動作しているかを検証します。
<除外対象のログ(exclude_at_match
で指定した文字列)>
echo "イニシエーターは iSCSI PDU を送信できませんでした。ダンプ データにエラー状態が示されています。" | sudo tee -a /var/log/test-log.log イニシエーターは iSCSI PDU を送信できませんでした。ダンプ データにエラー状態が示されています。 echo "ターゲットは NOP 要求に時間内に応答できませんでした。" | sudo tee -a /var/log/test-log.log ターゲットは NOP 要求に時間内に応答できませんでした。 echo "ターゲットはログイン要求に時間内に応答できませんでした。" | sudo tee -a /var/log/test-log.log ターゲットはログイン要求に時間内に応答できませんでした。
<正常ログ(exclude_at_match
で指定していない、Datadogに送られるべきログ)>
exclude_at_match
で指定した文字列が除外され、指定していない文字列は正常に送信されることを確認するため、除外対象ではない任意の文字列を書き込みます。- 除外対象の文字列にスペースが含まれるので、除外対象ではない文字列にもスペースを含め、正常にログが送信されることを確認します。
echo "これは正常なログです。" | sudo tee -a /var/log/test-log.log これは正常なログです。 echo "これは 正常な ログです。" | sudo tee -a /var/log/test-log.log これは 正常な ログです。
検証結果確認
Datadog Agentのステータス確認
- Datadog Agentがログを検知して送信したか、またはフィルタで除外されたかを確認します。
LogsProcessed
とLogsSent
の値が2であることが確認できました。テストで送信した正常ログの2つ分だけ検知されていることが分かります。
sudo datadog-agent status ...(省略) ========== Logs Agent ========== Reliable: Sending compressed logs in HTTPS to agent-http-intake.logs.datadoghq.com. on port 443 BytesSent: 466 EncodedBytesSent: 421 LogsProcessed: 2 LogsSent: 2 LogsTruncated: 0 RetryCount: 0 RetryTimeSpent: 0s CoreAgentProcessOpenFiles: 27 OSFileLimit: 65535 ============ Integrations ============ test-log -------- - Type: file Path: /var/log/test-log.log Service: test-log Source: custom Status: OK Inputs: /var/log/test-log.log Bytes Read: 363 Pipeline Latency: Average Latency: 112.291µs 24h Average Latency: 112.291µs Peak Latency: 145.718µs 24h Peak Latency: 145.718µs ...(省略)
Logs Agent
If the Logs Agent is enabled, this section displays information on the logs processed and sent, for example:
LogsProcessed: 10
LogsSent: 10
引用:https://docs.datadoghq.com/ja/agent/configuration/agent-status-page/#logs-agent.
Datadogコンソールでの確認
exclude_at_match
で指定した文字列が送信されていないこと、指定していない文字列が送信されていることをコンソール上で確認します。- DatadogコンソールのLogs > Logs Explorerより、テストログを送信した時間を見てみると、
exclude_at_match
で指定した文字列のログは表示されず、指定していないログのみ確認できました。 - 以上より、
exclude_at_match
による指定した日本語文字列は正常に除外できたことが確認できました。
おわりに
今回の検証では、Datadog Logs Agentを用いて、日本語を含むログファイルから特定のログ行のみを除外する構成が可能であることを確認できました。
Datadog公式ドキュメントでは英数字ベースのサンプルのみ記載されていたものの、本番環境で除外したいエラーログは下記の条件でした。
- 日本語文字列
- スペースを含む文章
- 複数パターンの除外が必要
このような条件下でも、英数字での表記方法と変わらず、意図したログのみを除外できました。
参考資料
ログ収集の高度な構成
Agent Configuration Files
ホスト Agent ログの収集
ログの収集とインテグレーション
Agent Status Page