CloudWatch 日志表现怪异
CloudWatch logs acting weird
我有两个包含多行日志语句的日志文件。它们在每个日志语句的开头都有相同的日期时间格式。配置如下所示:
state_file = /var/lib/awslogs/agent-state
[/opt/logdir/log1.0]
datetime_format = %Y-%m-%d %H:%M:%S
file = /opt/logdir/log1.0
log_stream_name = /opt/logdir/logs/log1.0
initial_position = start_of_file
multi_line_start_pattern = {datetime_format}
log_group_name = my.log.group
[/opt/logdir/log2-console.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /opt/logdir/log2-console.log
log_stream_name = /opt/logdir/log2-console.log
initial_position = start_of_file
multi_line_start_pattern = {datetime_format}
log_group_name = my.log.group
cloudwatch 日志代理将 log1.0 日志正确发送到我在 cloudwatch 上的日志组,但是,它没有发送 log2-console.log.
的日志文件
awslogs.log 说:
2016-11-15 08:11:41,308 - cwlogs.push.batch - WARNING - 3593 - Thread-4 - Skip event: {'timestamp': 1479196444000, 'start_position': 42330916L, 'end_position': 42331504L}, reason: timestamp is more than 2 hours in future.
2016-11-15 08:11:41,308 - cwlogs.push.batch - WARNING - 3593 - Thread-4 - Skip event: {'timestamp': 1479196451000, 'start_position': 42331504L, 'end_position': 42332092L}, reason: timestamp is more than 2 hours in future.
虽然服务器时间是正确的。同样奇怪的是 start_position 和 end_position 中提到的行号在被推送的实际日志文件中不存在。
还有其他人遇到这个问题吗?
我能够解决这个问题。
awslogs 的状态已损坏。状态存储在 /var/awslogs/state/agent-state 中的 sqlite 数据库中。您可以通过
访问它
sudo sqlite3 /var/awslogs/state/agent-state
需要 sudo 才能拥有写入权限。
列出所有流
select * from stream_state;
查找您的日志流并记下 source_id,它是 v 列中 json 数据结构的一部分。
然后,在 push_state table
select * from push_state where k="7675f84405fcb8fe5b6bb14eaa0c4bfd";
结果记录在包含 batch_timestamp 的 v 列中有一个 json 数据结构。而这个 batch_timestamp 似乎是错误的。这是过去的事,不再处理任何较新的(超过 2 小时)日志条目。
解决方法是更新这条记录。复制 v 列,将 batch_timestamp 替换为当前时间戳并更新为
update push_state set v='... insert new value here ...' where k='7675f84405fcb8fe5b6bb14eaa0c4bfd';
重启服务
sudo /etc/init.d/awslogs restart
希望对你有用!
我们遇到了同样的问题,下面的步骤解决了这个问题。
如果日志组未更新最新事件:
运行 这些步骤:
- 停止了 awslogs 服务
- 已删除文件/var/awslogs/state/agent-state
将 /var/awslogs/etc/awslogs.conf 配置从 hostaname 更新为
实例 ID 例如:
log_stream_name = {hostname} to log_stream_name = {instance_id}
- 已启动 awslogs 服务。
我通过以下方式在 Amazon Linux 上解决了这个问题:
- sudo yum 重新安装 awslogs
- sudo 服务 awslogs 重启
此方法将我的配置文件保留在 /var/awslogs/ 中,但您可能希望在重新安装之前备份它们。
注意:在我的故障排除过程中,我还通过 AWS 控制台删除了我的 Log Group
。重新启动完全重新加载了所有历史日志,但在当前时间戳,其价值较小。我不确定删除日志组是否是此方法工作所必需的。在重新启动之前,您可能需要查看将 initial_position 配置设置为 end_of_file
。
找到原因了。我的 docker 容器中的时区与我主机的时区不一致。设置两个时区一致后问题解决
我有两个包含多行日志语句的日志文件。它们在每个日志语句的开头都有相同的日期时间格式。配置如下所示:
state_file = /var/lib/awslogs/agent-state
[/opt/logdir/log1.0]
datetime_format = %Y-%m-%d %H:%M:%S
file = /opt/logdir/log1.0
log_stream_name = /opt/logdir/logs/log1.0
initial_position = start_of_file
multi_line_start_pattern = {datetime_format}
log_group_name = my.log.group
[/opt/logdir/log2-console.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /opt/logdir/log2-console.log
log_stream_name = /opt/logdir/log2-console.log
initial_position = start_of_file
multi_line_start_pattern = {datetime_format}
log_group_name = my.log.group
cloudwatch 日志代理将 log1.0 日志正确发送到我在 cloudwatch 上的日志组,但是,它没有发送 log2-console.log.
的日志文件awslogs.log 说:
2016-11-15 08:11:41,308 - cwlogs.push.batch - WARNING - 3593 - Thread-4 - Skip event: {'timestamp': 1479196444000, 'start_position': 42330916L, 'end_position': 42331504L}, reason: timestamp is more than 2 hours in future.
2016-11-15 08:11:41,308 - cwlogs.push.batch - WARNING - 3593 - Thread-4 - Skip event: {'timestamp': 1479196451000, 'start_position': 42331504L, 'end_position': 42332092L}, reason: timestamp is more than 2 hours in future.
虽然服务器时间是正确的。同样奇怪的是 start_position 和 end_position 中提到的行号在被推送的实际日志文件中不存在。
还有其他人遇到这个问题吗?
我能够解决这个问题。
awslogs 的状态已损坏。状态存储在 /var/awslogs/state/agent-state 中的 sqlite 数据库中。您可以通过
访问它sudo sqlite3 /var/awslogs/state/agent-state
需要 sudo 才能拥有写入权限。
列出所有流
select * from stream_state;
查找您的日志流并记下 source_id,它是 v 列中 json 数据结构的一部分。
然后,在 push_state table
select * from push_state where k="7675f84405fcb8fe5b6bb14eaa0c4bfd";
结果记录在包含 batch_timestamp 的 v 列中有一个 json 数据结构。而这个 batch_timestamp 似乎是错误的。这是过去的事,不再处理任何较新的(超过 2 小时)日志条目。
解决方法是更新这条记录。复制 v 列,将 batch_timestamp 替换为当前时间戳并更新为
update push_state set v='... insert new value here ...' where k='7675f84405fcb8fe5b6bb14eaa0c4bfd';
重启服务
sudo /etc/init.d/awslogs restart
希望对你有用!
我们遇到了同样的问题,下面的步骤解决了这个问题。
如果日志组未更新最新事件: 运行 这些步骤:
- 停止了 awslogs 服务
- 已删除文件/var/awslogs/state/agent-state
将 /var/awslogs/etc/awslogs.conf 配置从 hostaname 更新为 实例 ID 例如:
log_stream_name = {hostname} to log_stream_name = {instance_id}
- 已启动 awslogs 服务。
我通过以下方式在 Amazon Linux 上解决了这个问题:
- sudo yum 重新安装 awslogs
- sudo 服务 awslogs 重启
此方法将我的配置文件保留在 /var/awslogs/ 中,但您可能希望在重新安装之前备份它们。
注意:在我的故障排除过程中,我还通过 AWS 控制台删除了我的 Log Group
。重新启动完全重新加载了所有历史日志,但在当前时间戳,其价值较小。我不确定删除日志组是否是此方法工作所必需的。在重新启动之前,您可能需要查看将 initial_position 配置设置为 end_of_file
。
找到原因了。我的 docker 容器中的时区与我主机的时区不一致。设置两个时区一致后问题解决