EC2 インスタンス内部のログを Datadog に転送してみた

EC2 インスタンス内部のログを Datadog に転送してみた

Clock Icon2024.08.30

こんにちは。テクニカルサポートチームのShiinaです。

はじめに

前回、 Datadog Forwarder を利用して CloudWatch ログを Datadog に転送する方法をご紹介しました。
https://dev.classmethod.jp/articles/cloudwatchlog-forward-datadog/
今回は EC2 インスタンス内部のログ(ログファイルとイベントログ)をそれぞれ Datadog に転送してみたいと思います。

概要

EC2 インスタンス内のログを Datadog に転送するには Datadog エージェントを利用します。
はじめに、インストール手順に従って Datadog エージェントのインストールを行います。
次に yaml 形式のコンフィグレーションファイルを通じて、Datadog エージェントに対して転送したいログファイルパスなどの設定を行います。

事前準備

Datadog エージェントのセットアップには以下の事前準備が必要です。

  • DatadogAPI キー情報
  • Datadog の利用サイト情報
  • EC2 インスタンスからインターネットへの通信経路の確保
    ※インストーラーファイルの取得および Datadog にログを転送するための通信を行う必要があります。 プライベートサブネット環境の場合は NAT ゲートウェイなどをご用意ください。

エージェントのインストール

EC2 インスタンスに Datadog エージェントのインストールを行います。
Datadog コンソールからプラットフォームに適した Datadog エージェントのインストール手順を確認することができます。

1) Datadog コンソールの Integrations の Agent を選択します。
2) 希望のプラットフォームを選択し、表示される手順に従い Datadog エージェントをインストールします。
※ Select API Key をクリックすることで手順のコマンドがご自身の環境の Datadog APIKey が自動的に置き換わります。

Agent-Datadog

ログ収集の有効化

Datadog エージェントはデフォルトでログを収集しない設定となっています。
ログファイルやイベントログを収集するには datadog.yaml のコンフィグレーションを変更し、ログ収集を有効化する必要があります。

1) datadog.yaml を編集します。
ファイルパスは下記の通りです。

Linux
/etc/datadog-agent/datadog.yaml
Windows
C:\ProgramData\Datadog\datadog.yaml

2)datadog.yaml に下記のステートメントを追加して保存します。

logs_enabled: true
datadog.yaml

(中略)
## Set to 'us3.datadoghq.com' to send data to the US3 site.
## Set to 'us5.datadoghq.com' to send data to the US5 site.
## Set to 'ap1.datadoghq.com' to send data to the AP1 site.
## Set to 'ddog-gov.com' to send data to the US1-FED site.
#
#
site: datadoghq.com

logs_enabled: true
## @param dd_url - string - optional - default: https://app.datadoghq.com
## @env DD_DD_URL - string - optional - default: https://app.datadoghq.com
## @env DD_URL - string - optional - default: https://app.datadoghq.com
## The host of the Datadog intake server to send metrics to, only set this option
## if you need the Agent to send metrics to a custom URL, it overrides the site
(中略)

ログファイル収集設定

EC2 インスタンス内部のログファイルを収集するには Datadog エージェントでファイルタイプのカスタムログ収集の設定を行います。

1) Agent の構成ディレクトリのルートの conf_d ディレクトリ内に任意の名前のディレクトリを作成します。
今回は logs_d というディレクトリ名を作成しました。

Linux
/etc/datadog-agent/conf_d/logs_d
Windows
C:\ProgramData\Datadog\conf_d\logs_d

2) 作成したディレクトリ内に conf.yaml ファイルを新規作成します。
下記のようなファイルパスとなるように配置してください。

Linux
/etc/datadog-agent/conf_d/logs_d/conf.yaml
Windows
C:\ProgramData\Datadog\conf_d\logs_d\conf.yaml

3) conf.yaml ファイルに収集したいログのファイルパスを指定します。
Linux では nginx のアクセスログとエラーログ、Windows ではスクリプトのログを収集してみます。

conf.yaml
logs:
  - type: file
    path: "/var/log/nginx/access.log"
    service: "nginx"
    source: "webserver"
  - type: file
    path: "/var/log/nginx/error.log"
    service: "nginx"
    source: "webserver"
conf.yaml
logs:
  - type: file
    path: "C:\\batch\\scriptlog.txt"
    service: "script"
    source: "batchserver"

(補足)
ログファイルのエンコーディングは UTF-8 として読み取ります。
encoding パラメータを指定することで shift-jis の読み取りも可能です。

4) Datadog エージェントの再起動を行い、設定を反映させます。

Linux
systemctl restart datadog-agent
Windows
& "$env:ProgramFiles\Datadog\Datadog Agent\bin\agent.exe" restart-service

イベントログ収集設定

Windows のイベントログを収集するには Datadog エージェントでイベントログタイプのカスタムログ収集の設定を行います。

1) 下記のファイルパスに conf.yaml ファイルを新規作成します。

Windows
C:\ProgramData\Datadog\conf_d\win32_event_log.d\conf.yaml

2) conf.yaml ファイルに収集したいイベントログのチャネルパスを指定します。
Application、System、Security のイベントログを収集してみます。

conf.yaml
logs:
  - type: windows_event
    channel_path: "Application"
    source: "Application"
    service: "batchserver"
    sourcecategory: windowsevent

  - type: windows_event
    channel_path: "System"
    source: "System"
    service: "batchserver"
    sourcecategory: windowsevent

  - type: windows_event
    channel_path: "Security"
    source: "Security"
    service: "batchserver"
    sourcecategory: windowsevent

4) Datadog エージェントの再起動を行い、設定を反映させます。

Windows
& "$env:ProgramFiles\Datadog\Datadog Agent\bin\agent.exe" restart-service

ログ出力テスト

擬似的なログメッセージを出力して Datadogエージェントのログ転送のテストを行なっていきます。

  • ログファイル
echo Test Message!  >> /var/log/nginx/access.log
echo Test Error Message!  >> /var/log/nginx/error.log
Add-Content -Path C:\batch\scriptlog.txt -Value "Test Message!"
  • イベントログ
New-EventLog -Source "TestAppLog" -LogName "Application" 
Write-EventLog -LogName "Application" -Source "TestAppLog" -EventID 1001 -EntryType Information -Message "Test Message!"

Datadog でのログ確認方法

出力されたログイベントを Datadog で確認して行きます。

1)Datadog コンソールの Logs より Explorer をクリックします。

image (20)

2)Explorer ではデフォルトで直近15分間のログが表示されるため、ログが出力された時間帯を含むタイムスライスに適宜変更します。

image (21)

3)ログが表示されていることを確認します。
Logs Explorer の Search for フィールドにログファイル名やソースのタグを入力することでフィルタができます。

  • nginx アクセスログ 
    accesslog

  • nginx エラーログ
    errorlog

  • スクリプトログ
    scriptlog

  • Application イベントログ
    eventapplication

  • System イベントログ
    eventsystem

  • Security イベントログ
    eventsecurity

よくあるトラブル

いくつかログ収集におけるトラブルについてご紹介します。
ログ周りはハマりやすいのでご注意ください。

アクセス権限が不足している

Datadog エージェントがログファイルの読み取りを行うにはログファイルおよびサブディレクトリへの読み取りおよび実行権限が必要です。
Datadog エージェントのユーザ(dd-agent)に対してアクセス権を付与する必要があります。
ローテーションされるログファイルの場合、ローテーション後も権限を保持できるようローテーション側の設定も必要となります。

上書きでログ書き込みしている

Datadog エージェントでは読み取った行などのポインター情報を保持しています。
そのため、ログファイルは追記を行う必要があります。
既存行対して上書きでログを書き込みしてしまうと正しくログを転送できない恐れがあります。

ログメッセージに改行コードがない

ログメッセージ行は改行文字、n または \r\n で終了する必要があります。
テキストエディタ等でテストログの書き込みを行う際には改行コードを含める必要があります。

ログメッセージに含まれるタイムスタンプが過去となっている

タイムスタンプが 18 時間以上過去のものは Datadog 側で破棄される仕様となっています。
過去のログをテストに利用する際にはタイムスタンプを修正して出力する必要があります。

追跡できるログファイル上限に達している

Datadog エージェントのデフォルト設定では Linux で最大 500 ログファイル、Window で最大 200 ログファイルを追跡できます。
ファイルパスにワイルドカードを指定している場合、ディレクトリ内のログファイル数が多くならないようなログ運用が必要です。
datadog.yaml に open_files_limit パラメータを指定することで上限を回避することも可能ですが、パフォーマンスへの影響に注意が必要です。

まとめ

EC2 インスタンス内のログを Datadog に転送するには Datadog エージェントのインストールとログ転送の有効化が必要です。
収集したいログのタイプやファイルパスを conf.yaml に記述し、所定のパスに保存します。
Datadog エージェントの再起動を行うとログの収集が開始されます。

最後までご覧いただきありがとうございました。
本記事が誰かのお役に立てれば幸いです。

参考

https://docs.datadoghq.com/ja/agent/logs/?tab=tailfiles
https://docs.datadoghq.com/ja/logs/guide/log-collection-troubleshooting-guide/?tab=linux
https://docs.datadoghq.com/ja/logs/guide/increase-number-of-log-files-tailed/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.