如何从Amazon Cloudwatch过滤和提取原始日志事件数据

时间:2015-01-06 17:55:40

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

有没有办法1)过滤和2)通过API或CLI从Cloudwatch中检索原始日志数据?我需要从Cloudwatch中提取一部分日志事件进行分析。

我不需要创建指标或类似的东西。这是针对特定事件的历史研究。

我已经进入了控制台中的日志查看器,但我试图拉出特定的行来告诉我一段时间的故事。日志查看器几乎不可能用于此目的。如果我有实际的日志文件,我只会grep并在大约3秒内完成。但我没有。

澄清

Cloudwatch Logs的说明中,它说:“您可以查看原始日志数据(仅在网络视图中?),以便在需要时查看问题的根源。只要您需要使用高度耐用,低成本的存储,就可以存储和访问(仅在Web视图中?),因此您不必担心填满硬盘驱动器。“ - 是我的

如果此控制台视图是获取源数据的唯一方法,那么通过Cloudwatch存储日志对我来说不是一个可接受的解决方案。我需要以足够的灵活性来获取实际数据来搜索模式,而不是点击几十页的行并复制/粘贴。但是,似乎无法获得更好的获取源数据的方法。

5 个答案:

答案 0 :(得分:39)

使用AWSCLI(普通插件和cwlogs插件)请参阅http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/SearchDataFilterPattern.html

对于模式语法(plain text[space separated]{JSON syntax}),请参阅:http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html

对于python命令行实用程序awslogs,请参阅https://github.com/jorgebastida/awslogs

AWSCLI:aws logs filter-log-events

AWSCLI是AWS服务的官方CLI,现在它也支持日志。

显示帮助:

$ aws logs filter-log-events help

过滤器可以基于:

  • 日志组名--log-group-name(仅使用最后一个)
  • 日志流名称--log-stream-name(可多次指定)
  • 开始时间--start-time
  • 结束时间--end-time(不是--stop-time
  • 过滤模式--filter-pattern

只有--log-group-name是强制性的。

时间用毫秒(而不是秒)表示为纪元。

电话可能如下:

$ aws logs filter-log-events \
    --start-time 1447167000000 \
    --end-time 1447167600000 \
    --log-group-name /var/log/syslog \
    --filter-pattern ERROR \
    --output text

它打印6列制表符分隔文本:

  • 1st:EVENTS(表示该行是日志记录而非其他信息)
  • 第二名:eventId
  • 3rd:timestamp(记录为活动时间宣布的时间)
  • 第4名:logStreamName
  • 第5名:message
  • 6th:ingestionTime

因此,如果您手头有Linux命令行实用程序,并且只关注从2015-11-10T14:50:00Z2015-11-10T15:00:00Z的间隔的日志记录消息,您可以按如下方式获取:

$ aws logs filter-log-events \
    --start-time `date -d 2015-11-10T14:50:00Z +%s`000 \
    --end-time `date -d 2015-11-10T15:00:00Z +%s`000 \
    --log-group-name /var/log/syslog \
    --filter-pattern ERROR \
    --output text| grep "^EVENTS"|cut -f 5

带有cwlogs插件的AWSCLI

cwlogs AWSCLI插件更易于使用:

$ aws logs filter \
    --start-time 2015-11-10T14:50:00Z \
    --end-time 2015-11-10T15:00:00Z \
    --log-group-name /var/log/syslog \
    --filter-pattern ERROR

它需要人类可读的日期时间,并始终返回带有(空格分隔)列的文本输出:

  • 1st:logStreamName
  • 第二名:date
  • 第3名:time
  • 第4次到最后:message

另一方面,安装起来有点困难(需要更多的步骤加上当前pip要求将安装域声明为可信域)。

$ pip install awscli-cwlogs --upgrade \
--extra-index-url=http://aws-cloudwatch.s3-website-us-east-1.amazonaws.com/ \
--trusted-host aws-cloudwatch.s3-website-us-east-1.amazonaws.com
$ aws configure set plugins.cwlogs cwlogs

(如果您在最后一个命令中输入拼写错误,只需在~/.aws/config文件中更正)

来自awslogs

jorgebastida/awslogs命令

这是我最喜欢的一个 - 易于安装,功能强大,易于使用。

安装:

$ pip install awslogs

列出可用的日志组:

$ awslogs groups

列出日志流

$ awslogs streams /var/log/syslog

获取记录并跟踪它们(请参阅新的记录):

$ awslogs get --watch /var/log/syslog

您可以按时间范围过滤记录:

$ awslogs get /var/log/syslog -s 2015-11-10T15:45:00 -e 2015-11-10T15:50:00

从版本0.2.0开始,您还有--filter-pattern选项。

输出包含列:

  • 1st:日志组名称
  • 第二名:日志流名称
  • 第3名:message

使用--no-group--no-stream,您可以关闭前两列。

使用--no-color可能会消除输出中的颜色控制字符。

编辑:正如awslogs版本0.2.0添加--filter-pattern,文字已更新。

答案 1 :(得分:1)

如果您使用Python Boto3库来提取AWS cloudwatch日志。 get_log_events()的函数接受以毫秒为单位的开始和结束时间。

供参考:http://boto3.readthedocs.org/en/latest/reference/services/logs.html#CloudWatchLogs.Client.get_log_events

为此你可以使用UTC时间输入并使用Datetime和timegm模块将其转换为毫秒,你很高兴:

from calendar import timegm
from datetime import datetime, timedelta

# If no time filters are given use the last hour
now = datetime.utcnow()
start_time = start_time or now - timedelta(hours=1)
end_time = end_time or now
start_ms = timegm(start_time.utctimetuple()) * 1000
end_ms = timegm(end_time.utctimetuple()) * 1000

因此,您可以使用sys输入作为如下所述的输入:

python flowlog_read.py '2015-11-13 00:00:00' '2015-11-14 00:00:00'

答案 2 :(得分:1)

虽然Jan的答案非常好,而且可能是作者想要的答案,但请注意,还有另一种方法可以通过subscriptions以编程方式访问日志。

这适用于始终在线的流式场景,其中不断获取数据(通常进入Kinesis流)然后进一步处理。

答案 3 :(得分:0)

Haven自己使用它,但这是我在GitHub上遇到的Excel导出器的开源云监视器:

https://github.com/petezybrick/awscwxls

  

通用AWS CloudWatch到电子表格导出程序 CloudWatch不提供导出实用程序 - 这样做。 awscwxls创建电子表格   基于命名空间/维度/度量/统计的通用集合   规格。只要AWS继续遵循   命名空间/维度/度量/统计模式,awscwxls应该适用   现有和未来的命名空间(服务)。每套规格   存储在属性文件中,因此每个属性文件都可以   为特定的一组AWS服务和资源配置。拿一个   查看run / properties / template.properties以获取完整的示例。

答案 4 :(得分:-1)

我认为检索数据的最佳选项是API

中所述