CloudWatch Logs へのログ転送と logrotate を併用すると、ログが欠損します。原因と対処法を教えてください

転送対象のログファイル名をワイルドカードで指定することで、改善が見込めます。
2022.09.06

困っていた内容

CludWatch エージェントを使用して EC2 インスタンス内部のログファイルを CloudWatch Logs へ転送していますが、対象のログファイルに logrotate を適用してファイルをローテーションさせると、CloudWatch Logs へのログ転送が欠損する場合があります。この原因と対処法を教えてください。

どう対応すればいいの?

考えられる原因

CloudWatch エージェントの設定ファイル内で転送対象のログファイル名を指定する file_path の記述が関連している可能性があります。

例えば設定ファイル内で以下のように記述していたとします。

CloudWatch エージェント設定ファイルの例:

この場合、CloudWatch Logs に転送される対象のログファイルは「system.log」のみとなります。
つまり logrotate によりファイルがローテーションされて「system.log_111、system.log_222 ...」等のファイル名に変更された場合、転送対象から外れることになります。
そのためローテーションのタイミングによっては、CloudWatch Logs への転送漏れが発生してしまう可能性があるのです。

対処方法

CloudWatch エージェント設定ファイルを編集して、file_path をワイルドカード指定に変更しましょう。
これにより、ローテーション後のファイル(「system.log_111、system.log_222 ...」等)も CloudWatch Logs への転送対象に含めることができます。

CloudWatch エージェント設定ファイルの例:

CloudWatch エージェント設定ファイルを編集したあとは、CloudWatch エージェントを再起動して設定を反映するのも忘れないようにしましょう。
※ 末尾の「configuration-file-path」の箇所は、実際の CloudWatch エージェント設定ファイルのパスに置き換えてください。

Linux インスタンスの場合のコマンド例:

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -s -m ec2 -c file:configuration-file-path

Windwos インスタンスの場合のコマンド例:

& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:"C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json"

これで、ログのローテーションによる CloudWatch Logs へのログ転送漏れの改善が期待できます。

この情報がどなたかのお役に立てば幸いです!

参考資料

CloudWatch エージェント設定ファイルを手動で作成または編集する - Amazon CloudWatch
CloudWatch エージェントを起動する - Amazon CloudWatch