CloudWatch日志表现得很奇怪

时间:2016-11-15 08:15:29

标签: amazon-web-services amazon-cloudwatch cloudwatch amazon-cloudwatchlogs

我有两个带有多行日志语句的日志文件。它们在每个日志语句的开头都具有相同的日期时间格式。配置如下所示:

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中提到的行号在被推送的实际日志文件中不存在。

其他人遇到此问题?

4 个答案:

答案 0 :(得分:11)

我能解决这个问题。

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 表中列出所有带有此source_id的记录(在我的情况下是7675f84405fcb8fe5b6bb14eaa0c4bfd)

select * from push_state where k="7675f84405fcb8fe5b6bb14eaa0c4bfd";

结果记录在v列中有一个json数据结构,其中包含batch_timestamp。而这个batch_timestamp接缝错了。它已经过去,任何较新的(超过2小时)日志条目都不再处理。

解决方案是更新此记录。复制v列,将batch_timestamp替换为当前时间戳,并使用类似

的更新进行更新
update push_state set v='... insert new value here ...' where k='7675f84405fcb8fe5b6bb14eaa0c4bfd';

使用

重启服务
sudo /etc/init.d/awslogs restart

我希望它适合你!

答案 1 :(得分:1)

我们遇到了同样的问题,以下步骤解决了这个问题。

如果日志组未使用最新事件进行更新: 运行以下步骤:

  1. 停止了awslogs服务
  2. 已删除文件 / var / awslogs / state / agent-state
  3. 从hostaname更新了 /var/awslogs/etc/awslogs.conf 配置 实例ID Ex:

    log_stream_name = {hostname} to log_stream_name = {instance_id}   
    
  4. 启动了awslogs服务。

答案 2 :(得分:0)

我能够通过以下方式在Amazon Linux上解决此问题:

  1. sudo yum重新安装awslogs
  2. sudo service awslogs restart
  3. 此方法在/ var / awslogs /中保留了我的配置文件,但您可能希望在重新安装之前备份它们。

    注意:在我的问题排查中,我还通过AWS控制台删除了Log Group。重新启动完全重新加载所有历史日志,但是在当前时间戳中,其值较低。我不确定是否删除日志组这对于此方法的工作是必要的。您可能希望在重新启动之前将initial_position配置设置为end_of_file

答案 3 :(得分:0)

我找到了原因。我的Docker容器中的时区与我的主机的时区不一致。将两个时区设置为一致后,问题得以解决