経緯
公式ドキュメントには、CloudWatch Agent で CloudWatch Logs に送信するLog stream名に以下のものが指定できますが、保持期間が長いと過去ログをあさる際に何度も Load more. をクリックしないといけなかったり、Log Insights QL で検索したりと結構めんどうだったりします
(Athenaに転送していればいいだけの話ではありますが)
名前の一部として、名前では変数として {instance_id}、{hostname}、{local_hostname}、{ip_address} を使用することができます。{hostname} は、EC2 メタデータからホスト名を取得し、{local_hostname} は、ネットワーク設定ファイルからホスト名を使用します。
このフィールドを省略すると、グローバル log_stream_name セクションの logs パラメータの値が使用されます。これも省略すると、{instance_id} のデフォルト値が使用されます。
Log stream名を定期的に変えられないかなぁ。。。と調査した際のメモです
{date} という変数が使えるらしい
公式ドキュメントには記載がありませんが、以下の書き込みを見ると {date}
という変数が存在するらしいです
AWS CloudWatch Logs Stream - how configure awslogs to write every day new log stream to the same log group from the same instance?
const (
instanceIdPlaceholder = "{instance_id}"
hostnamePlaceholder = "{hostname}"
localHostnamePlaceholder = "{local_hostname}" //regardless of ec2 metadata
ipAddressPlaceholder = "{ip_address}"
awsRegionPlaceholder = "{aws_region}"
datePlaceholder = "{date}"
unknownInstanceId = "i-UNKNOWN"
unknownHostname = "UNKNOWN-HOST"
unknownIpAddress = "UNKNOWN-IP"
unknownAwsRegion = "UNKNOWN-REGION"
)
試しに amazon-cloudwatch-agent.json の log_stream_name に {date}
を追加してみます
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/nginx/error.log",
"log_group_name": "/ec2/nginx/errors",
"log_stream_name": "{local_hostname}_{date}",
"timestamp_format": "%Y/%m/%d %H:%M:%S"
}
]
}
}
}
}
また、これらの変数はCloudWatch Agentの起動時に展開されるため、午前0時に再起動するよう root の cron に以下を追加します
0 0 * * * /usr/bin/systemctl restart amazon-cloudwatch-agent
CloudWatch Logsを確認するとLog stream名に日付が追加されました
公式には記載がないのでそのうちサポートされなくなってしまうかもしれないですが、やりたいことは実現できました