はじめに

本記事の目的: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.yamlを配置することで、そのログ設定を認識します。
  • 今回はLinux環境下なので、/etc/datadog-agent/conf.d/ 配下に <任意名>.d/conf.yamlを配置します。ここでは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 ファイルを作成します。

引用:https://docs.datadoghq.com/ja/agent/logs/?tab=tailfiles#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AD%E3%82%B0%E5%8F%8E%E9%9B%862.

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がログを検知して送信したか、またはフィルタで除外されたかを確認します。
  • LogsProcessedLogsSentの値が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