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

Zac*_*ach 19 logging amazon-web-services amazon-cloudwatch

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

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

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

澄清

Cloudwatch日志的描述中,它说:"您可以查看原始日志数据(仅在Web视图中?),以便在需要时查看问题的根源.可以存储和访问日志数据(仅在Web视图中? )只要你需要使用高度耐用,低成本的存储,你就不必担心填满硬盘." - 是我的

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

Jan*_*sky 44

有关使用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记录filter-log-events

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

要显示帮助:

$ aws logs filter-log-events help
Run Code Online (Sandbox Code Playgroud)

过滤器可以基于:

  • 日志组名称--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
Run Code Online (Sandbox Code Playgroud)

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

  • 1st :( EVENTS表示该行是日志记录而不是其他信息)
  • 第二: eventId
  • 第3名:( timestamp记录作为活动时间宣布的时间)
  • 第4名: logStreamName
  • 第五: message
  • 6日: 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
Run Code Online (Sandbox Code Playgroud)

带有cwlogs插件的AWSCLI

cwlogsAWSCLI插件是简单的使用方法:

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

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

  • 第一名: logStreamName
  • 第二: date
  • 第三: 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
Run Code Online (Sandbox Code Playgroud)

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

awslogs 命令来自 jorgebastida/awslogs

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

安装:

$ pip install awslogs
Run Code Online (Sandbox Code Playgroud)

列出可用的日志组:

$ awslogs groups
Run Code Online (Sandbox Code Playgroud)

列出日志流

$ awslogs streams /var/log/syslog
Run Code Online (Sandbox Code Playgroud)

要获取记录并按照它们进行操作(请参阅新的记录):

$ awslogs get --watch /var/log/syslog
Run Code Online (Sandbox Code Playgroud)

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

$ awslogs get /var/log/syslog -s 2015-11-10T15:45:00 -e 2015-11-10T15:50:00
Run Code Online (Sandbox Code Playgroud)

从版本0.2.0开始,您还可以--filter-pattern选择.

输出有列:

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

使用--no-group--no-stream你可以关闭前两列.

使用--no-color你可以摆脱输出中的颜色控制字符.

编辑:随着awslogs版本0.2.0添加--filter-pattern,文本更新.