公式ドキュメントに記述されているFAQの翻訳みたいになってしまいましたが、
CloudWatch Logsを実際使うに当たって、CloudWatch Logs Agent の挙動について調べたことのまとめです。
設定ファイルについてはこっちにまとめました。
設定ファイルを変更したので、設定を反映させたい
設定ファイル/var/awslogs/etc/awslogs.conf
に以下の記述がありました。
NOTE: A running agent must be stopped and restarted for configuration changes to take effect.
configを再読み込みさせる場合は、Agentのrestartが必要そうです。
condrestartとかは無いみたいですね。
ログがローテーションした場合はどうなるの?
ファイルのローテーションについては、以下の条件であればサポートされます
- ファイルがリネームされ、同名のファイルが新規作成される
- ファイルがコピーされ、中身がトランケートされる
- ファイルが同じような条件で新規作成される
3はちょっとわかりずらいのですが、ログローテートのルールとして日付でインクリメントしていくようなパターンを想定しているようです。
/var/log/message-20140808 の後に、/var/log/message-20140809が作られるような場合が該当しますね。
ドキュメントに、
Creating a new file with a common pattern as the old one.
って書いてあるけど、common pattern
ってどこまで許容されるの?って思い、ソースを見てみました。
ログ送信の対象となるファイルを選定する実装は、以下に記述されています。
/var/awslogs/lib64/python2.6/site-packages/cwlogs/push.py
ざっくり言うと、パスにマッチしたファイル一覧の中から、変更日付の一番新しいファイルに対して処理を行うようです。
ちょっとだけ具体的にすると、こんな感じでした。
- 設定の
file = <value>
に指定した値でファイル一覧を取得 - ファイル一覧をmtimeを降順でソートする
- 一番新しいmtimeの1ファイルに対して処理を行う
こんな感じで、ローテートしても同じストリームにログが流れるようになっているみたいです。
ログイベントってどうやってバッチされるの?
ログイベントはある程度まとめてバッチされるのですが、
1回のバッチで、容量(32k)、件数(1000件)、時間(24h)の制限があるようで、
以下の条件にハマるとバッチされるようです。
- 最初のログイベントが届いてから、
buffer_duration
で設定した時間が過ぎた場合 - 新しくログイベントを追加したタイミングで、32kを超えているような場合
- ログイベントが1000件集まった場合
- ログイベントのタイムレンジが24hを超えた場合
cwlogs/push.py
のEventBatch
classを確認するのが手っ取り早いです。
ログ送信のスキップについて
PutLogEvents API には制約があり、以下のような場合にスキップされるようです。
- ログイベントが32kを超えるような場合
- ログイベントの時刻が2時間以上未来の場合
- ログイベントの時刻が14日過去以上過去の場合
- ロググループの保持期間(retention period)より過去の場合
適当にログファイルにログを突っ込んで挙動を確かめてたら上記の3に該当し、
ログ送信されなくて若干ハマりました。
ちなみにemitされない場合は、/var/log/awslogs.log
に
きちんとログが出力されるので安心(?)です。
Agentが止まっている間のログってどうなるの?
state_file
が利用可能で、最後にAgentを起動してからログローテートされてなければ、停止した所から再度pushし始めるとのこと。
逆に言うと、ローテートされていた場合は、ローテートされる前のファイルに対して何かしらリカバリーしないとですね。
重要なログは、ちょっと注意が必要そう。
異なる複数のログをひとつのストリームにまとめたい
Configuring multiple log sources to send data to a single log stream is not supported.
Log Streamの運用を考えている時に思いついたのですが、サポートされてませんでした。
Agentが Log Groupや、Log Streamを自動で作るのをやめさせたい
IAMポリシーで、DescribeLogStreams, PutLogEventsのみを許可するようにすればいいみたいです。
参考
http://aws.typepad.com/aws_japan/2014/07/cloudwatch-log-service.html
https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AgentReference.html