CloudWatch日志表现得很奇怪

Fur*_* S. 9 amazon-web-services cloudwatch amazon-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
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

虽然服务器时间是正确的.同样奇怪的是,start_position和end_position中提到的行号在推送的实际日志文件中不存在.

有其他人遇到过这个问题吗?

Bjö*_*ner 14

我能解决这个问题.

awslogs的状态被打破了.状态存储在/ var/awslogs/state/agent-state中的sqlite数据库中.你可以通过它访问它

sudo sqlite3 /var/awslogs/state/agent-state
Run Code Online (Sandbox Code Playgroud)

sudo需要具有写访问权限.

列出所有流

select * from stream_state;
Run Code Online (Sandbox Code Playgroud)

查找日志流并记下source_id,它是v列中json数据结构的一部分.

然后,在push_state表中列出所有带有此source_id的记录(在我的例子中,它是7675f84405fcb8fe5b6bb14eaa0c4bfd)

select * from push_state where k="7675f84405fcb8fe5b6bb14eaa0c4bfd";
Run Code Online (Sandbox Code Playgroud)

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

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

update push_state set v='... insert new value here ...' where k='7675f84405fcb8fe5b6bb14eaa0c4bfd';
Run Code Online (Sandbox Code Playgroud)

使用重新启动服务

sudo /etc/init.d/awslogs restart
Run Code Online (Sandbox Code Playgroud)

我希望这个对你有用!

  • 在我的情况下,push_state 表是空的 - 我该怎么办? (2认同)

小智 6

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

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

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

    log_stream_name = {hostname} to log_stream_name = {instance_id}   
    
    Run Code Online (Sandbox Code Playgroud)
  4. 启动 awslogs 服务。

  • 我不知道这是否优雅,但它对我有用,我认为它比公认的答案更快更容易。我想补充一点,对我来说,代理状态位于 /var/lib/awslogs/state/ 下。您可以在 /etc/awslogs/awslogs.conf 文件中查看此文件的位置 (2认同)