5

我有两个包含多行日志语句的日志文件。他们两个在每个日志语句的开头都有相同的日期时间格式。配置是这样的:CloudWatch日志表现怪异

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的,然而,它不发送日志文件的log 2-的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在实际的日志文件被推入时不存在。

任何其他人遇到此问题?

+0

我有同样的效果,仍然在寻找解决方案。重新启动服务没有帮助。 BTW:start_position和end_position不是行号,而是字节位置。 –

回答

8

我能解决这个问题。

awslogs状态被打破。状态存储在/ var/awslogs/state/agent-state中的sqlite数据库中。您可以通过

sudo sqlite3 /var/awslogs/state/agent-state 

sudo需要写入权限。

列出所有与

select * from stream_state; 

流查一查你的日志流,并注意SOURCE_ID这是在V列中的JSON数据结构的一部分。

然后列出这个SOURCE_ID所有记录(在我的情况下,它是7675f84405fcb8fe5b6bb14eaa0c4bfd)在push_state

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

所得记录在其中包含batch_timestamp在V列中的JSON数据结构。而这个batch_timestamp接缝是错误的。它在过去,任何更新(超过2小时)的日志条目都不再被处理。

解决方法是更新此记录。复制V色谱柱,与当前的时间戳和更新的东西与

sudo /etc/init.d/awslogs restart 

我希望它为你更换batch_timestamp像

update push_state set v='... insert new value here ...' where k='7675f84405fcb8fe5b6bb14eaa0c4bfd'; 

重新启动该服务!

+0

在我的情况下,push_state表是空的 - 我该怎么办? – Andrey

+0

但是,您会收到警告“...原因:未来时间戳超过2小时”。使用“sudo /etc/init.d/awslogs restart”重新启动服务? –

+0

嘿,你有什么办法强制重置cloudwatch日志?看起来我在几台机器上遇到了这个问题,而且我无法真正负担登录到每台机器并执行每个实例。我很抱歉丢失了以前的非同步日志。当发生这样的问题时,我的磁盘空间似乎每小时都会填充1GB,所以我的Web服务只是在一夜之间死掉...... –

0

我们遇到了同样的问题,以下步骤解决了问题。 执行这些步骤:

如果日志组不与最近发生的事件更新

  1. 停止awslogs服务
  2. 删除的文件在/ var/awslogs /国家/剂状态
  3. 更新了/var/awslogs/etc/awslogs。CONF从hostaname配置 实例ID例如:

    log_stream_name = {hostname} to log_stream_name = {instance_id} 
    
  4. 发起者awslogs服务。
0

我能够解决在Amazon Linux的这个问题:

  1. 须藤yum的重装awslogs
  2. sudo的服务awslogs重启

这种方法保留在/ var我的配置文件/ awslogs /,尽管您可能希望在重新安装前备份它们。

注意:在我的疑难解答中,我还通过AWS控制台删除了我的Log Group。重新启动完全重新加载所有历史日志,但是在当前时间戳处,这是较不值的。我不确定是否删除日志组是这种方法工作所必需的。在重新启动之前,您可能需要考虑将initial_position配置设置为end_of_file