AWS CloudWatch Logs Stream - 如何配置 awslogs 以将每天新的日志流从同一实例写入同一日志组?
Posted
技术标签:
【中文标题】AWS CloudWatch Logs Stream - 如何配置 awslogs 以将每天新的日志流从同一实例写入同一日志组?【英文标题】:AWS CloudWatch Logs Stream - how configure awslogs to write every day new log stream to the same log group from the same instance? 【发布时间】:2021-04-02 21:26:29 【问题描述】:我有 1 个使用以下 awslogs 配置文件的实例:
[general]
state_file = /var/lib/awslogs/agent-state
[logstream-0]
log_stream_name = controller
log_group_name = robots/controller
file = /mnt/data/log/controller.log
initial_position = start_of_file
[logstream-1]
log_stream_name = catcher
log_group_name = robots/catcher
file = /mnt/data/log/catcher.log
initial_position = start_of_file
CloudWatch 现在拥有 2 个日志组(每个组内部都有一个日志流):
机器人/控制器:
日志流:
controller
机器人/捕手:
日志流:
catcher
我的目标是每天创建一个新的日志流(当然是按时间戳)。
应该看起来像这样(日期时间格式并不重要):
机器人/控制器:
日志流:
controller_2020/12/24
controller_2020/12/23
controller_2020/12/22
机器人/捕手:
日志流:
catcher_2020/12/24
catcher_2020/12/23
catcher_2020/12/22
有什么想法吗?
【问题讨论】:
Loginsgihts 可以方便的按时间查询日志。这对成本节约和性能没有好处。为什么需要这个要求? 【参考方案1】:对于日志文件隔离,File 选项可以使用通配符(例如 /var/log/system.log*)指向特定文件或多个文件。 根据文件修改时间,仅将最新文件推送到 CloudWatch Logs。您需要将日志写入与模式匹配的新文件,您需要配置源日志以每天创建一个新文件
对于时间戳使用:datetime_format = %Y-%m-%d %H:%M:%S
【讨论】:
嗨,阿斯里。在这种情况下,它将从多个文件收集到同一个日志流。如果我理解正确,作者想要相反。定期将同一文件拆分为多个流。 我不认为可以根据时间戳自动创建日志流,它可以使用其他选项: log_stream_name 指定目标日志流。您可以使用文字字符串或预定义变量(instance_id、hostname、ip_address)或两者的组合来定义日志流名称。如果日志流尚不存在,则会自动创建日志流。 时间戳格式涉及流中的时间戳,而不是流名称。【参考方案2】:这是一种解决方法。这通过修改 systemd 服务文件并在 cw 代理配置中添加一个编辑占位符的脚本来工作。
/opt/aws/amazon-cloudwatch-agent/etc/config-template.json:
"agent":
"metrics_collection_interval": 10,
"logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
"region": "us-east-1"
,
"logs":
"logs_collected":
"files":
"collect_list": [
"file_path": "/var/log/messages",
"log_group_name": "/hybrid_instance_1",
"log_stream_name": "%%DATE%%-messages",
"timezone": "UTC"
]
,
"force_flush_interval": 15
/etc/systemd/system/amazon-cloudwatch-agent.service:
[Unit]
Description=Amazon CloudWatch Agent
After=network.target
[Service]
Type=simple
ExecStartPre=-/bin/bash -c "/usr/sbin/update_cw_agent_config"
ExecStart=/opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent
KillMode=process
Restart=on-failure
RestartSec=60s
[Install]
WantedBy=multi-user.target
/usr/sbin/update_cw_config:
#!/bin/bash
DATE_STRING=$(date +"%Y\/%m\/%d")
sed -r "s/%%DATE%%/$DATE_STRING/g" /opt/aws/amazon-cloudwatch-agent/etc/config-template.json > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
然后您可以通过 crontab 重新启动服务来运行 /usr/sbin/update_cw_config。您当然可以不编辑服务文件,只在每天午夜运行脚本,并附加“systemctl restart amazon-cloudwatch-agent”。我正在使用 systemd 文件,因为想要在代理重新启动时添加日期+分钟和秒的新流,而不仅仅是通过 cron。
【讨论】:
【参考方案3】:他们在他们的文档中什么也没说,但是查看their codebase 有一个名为date
的占位符
它以不同的日期格式进行格式化,但至少它没有变通办法。在我们的日志中对其进行了测试,它解析为 2021-12-21
格式。
【讨论】:
糟糕,我可能混合了 awslogd 和他们的新 amazon-cloudwatch-agent。以上是关于AWS CloudWatch Logs Stream - 如何配置 awslogs 以将每天新的日志流从同一实例写入同一日志组?的主要内容,如果未能解决你的问题,请参考以下文章
从包含纯文本的@message 字段解析值:AWS Cloudwatch Logs
为啥从我的 Windows EC2 实例发送的 CloudWatch Logs 没有显示在 AWS 控制台上?
AWS CloudWatch Logs Stream - 如何配置 awslogs 以将每天新的日志流从同一实例写入同一日志组?
地形导入 aws_cloudwatch_log_stream
使用Filebeat和AWS CloudWatch Logs将EC2上的Tomcat的access_log传送到ELasticsearch中并使用ILM完成日志的自动管理