Blogical

AWS/Salesforceを中心に様々な情報を配信していきます(/・ω・)/

Amazon CloudWatch Logsで監視対象のファイル名が日付で動的に変化する場合の設定について

こんにちは、ロジカル・アーツの福島です。先日、業務で既存のアプリケーションの改修作業があり、テスト環境に本番環境と同じCloudWatch Logsの設定を行う機会がありました。本番環境のログのPATHが日時を含む形になっており、それに対応してCloudWatch Logsの設定も動的に変化していました。一連の設定の中でcronを用いている部分に気づかず、テスト環境で動的にCloudWatch Logsの設定を変化させている方法が分かりませんでした。そこで今回はその際の一連の設定についてまとめようと思います。 なお、本文でも述べていますが、現在はCloudWatch Logsエージェントではなく、CloudWatchエージェントの使用が推奨されています。そのため、新規で設定する場合はこの記事での設定方法は参考にならない可能性があるので、ご注意ください。

Amazon CloudWatch Logsとは

様々なリソースで出力されるログを一元管理できるAWSのサービスの一つです。今回はAmazon Elastic Compute Cloud (Amazon EC2) インスタンスのログを連携し確認を行います。詳細は公式ページをご覧ください。

cronとは

Unix系のOSで使用できる機能の一つです。時刻を指定することでプログラムを定期的に実行したい場合使用できます。

前提条件

今回の環境はAmazon Linux 2のEC2インスタンスを使用し、CloudWatch Logs エージェントを使用しログの収集を行っていました。 新しく設定を行う場合は新しいCloudWatch エージェントを使用することが推奨されています。 CloudWatch エージェントを使用した場合は設定ファイルのPATHや内容が異なりますのでご注意ください。 今回の手順は、ロググループの作成の確認が済んでいる段階から進めていきたいと思います。

作業手順

ロググループの作成

CloudWatch Logsに連携するログの設定は/etc/awslogs/awslogs.confというファイルで行っています。 それぞれのパラメータは下記のような意味になっています。

パラメータ 内容
datetime_format 日付の形式
file CloudWatch Logsに連携するファイルのPATH
buffer_duration ログイベントのバッチ期間
log_stream_name ログストリームのPATH
initial_position データの読み出しをどこから開始するか(start_of_file または end_of_file)
log_group_name ロググループの名前

今回はファイル名が日時を含む形式で動的に変化する場合を考えます。 例として/var/log/access_20210319.log/var/log/error_20210319.logというログファイルをそれぞれ/var/log/access_20210319.log/var/log/error_20210319.logというロググループ名で連携する設定は下記です。

[/var/log/access_20210319.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/access_20210319.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/access_20210319.log
[/var/log/error_20210319.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/error_20210319.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/error_20210319.log

上記を/etc/awslogs/awslogs.confのファイルの末尾に追記します。

設定後CloudWatch Logsで追加されたロググループが作成されていることをご確認ください。 上記例の場合は/var/log/access_20210319.log/var/log/error_20210319.logというロググループが作成されます。

ロググループの日時を書き換えるスクリプトの作成

先ほど作成した/etc/awslogs/awslogs.confファイルの中身の日付部分を、当日の日付に変更するスクリプトを作成します。 (8桁の数字).log正規表現\([0-9]\{8\}\)\.log)を、当日の年月日($(date +%Y%m%d).log)に変更します。 該当のファイルに変更させたい部分とは別に置換対象の文字列がないかどうか確認が必要です。 変更した後CLoudWatch Logsエージェントを再起動します。

cronでスクリプトを実行

サーバ上で下記のコマンドを実行しcronの設定を行います。

crontab -e

エディタが開くのでエディタで設定を記述します。 下記の書き込みを行います。

0 0 * * * sudo bash {スクリプトPATH}
@restart  sudo bash {スクリプトPATH} 

毎日日付が変わるタイミング、サーバー起動時に実行する設定を記述しました。 上記の一連の設定でログファイル名に日付が入る場合でもCloudWatchLogsと連携し、ロググループを作成することができます。