Amazon web services 如何从Amazon Cloudwatch过滤和提取原始日志事件数据
有没有办法1)过滤和2)通过API或CLI从Cloudwatch中检索原始日志数据?我需要从Cloudwatch中提取日志事件的子集进行分析 我不需要创建度量或类似的东西。这是对特定事件的历史研究 我已经去了控制台中的日志查看器,但我正试图抽出特定的行来告诉我某个特定时间的故事。日志查看器几乎不可能用于此目的。如果我有实际的日志文件,我只需grep并在大约3秒钟内完成。但我没有 澄清 在的描述中,它说,“如果需要,您可以查看原始日志数据(仅在web视图?)以查看问题的根源。只要您需要使用高度耐用、低成本的存储,就可以存储和访问日志数据(仅在web视图?),这样您就不必担心填满硬盘。”--斜体是我的Amazon web services 如何从Amazon Cloudwatch过滤和提取原始日志事件数据,amazon-web-services,logging,amazon-cloudwatch,Amazon Web Services,Logging,Amazon Cloudwatch,有没有办法1)过滤和2)通过API或CLI从Cloudwatch中检索原始日志数据?我需要从Cloudwatch中提取日志事件的子集进行分析 我不需要创建度量或类似的东西。这是对特定事件的历史研究 我已经去了控制台中的日志查看器,但我正试图抽出特定的行来告诉我某个特定时间的故事。日志查看器几乎不可能用于此目的。如果我有实际的日志文件,我只需grep并在大约3秒钟内完成。但我没有 澄清 在的描述中,它说,“如果需要,您可以查看原始日志数据(仅在web视图?)以查看问题的根源。只要您需要使用高度耐用
如果此控制台视图是获取源数据的唯一方法,那么就我而言,通过Cloudwatch存储日志不是一个可接受的解决方案。我需要以足够的灵活性获取实际数据,以搜索模式,而不是点击几十页行和复制/粘贴。这似乎是一种更好的获取源数据的方法,但可能不可用。我自己没有使用过,但我在GitHub上遇到了一个开源的cloudwatch to Excel exporter: 通用AWS CloudWatch到电子表格导出器CloudWatch不提供导出实用程序-它提供。awscwxls创建电子表格 基于命名空间/维度/度量/统计的通用集合 规格。只要AWS继续遵循 名称空间/维度/度量/统计模式,awscwxls应该适用于 现有和未来的名称空间(服务)。每套规格 存储在属性文件中,因此每个属性文件都可以 为一组特定的AWS服务和资源配置。坐 查看run/properties/template.properties以获取完整示例
我认为检索数据的最佳选项如中所述。使用AWSCLI(普通版本以及
cwlogs
插件)请参阅
有关模式语法(纯文本
,[空格分隔]
和{JSON syntax}
)请参见:
有关python命令行实用程序awslogs
的信息,请参阅
AWSCLI:aws日志筛选器日志事件
AWSCLI是AWS服务的官方CLI,现在它也支持日志
要显示帮助,请执行以下操作:
$ aws logs filter-log-events help
该过滤器可以基于:
- 日志组名称<代码>--日志组名称<代码>(仅使用最后一个)
- 日志流名称<代码>--日志流名称(可以多次指定)
- 开始时间<代码>--开始时间
- 结束时间
(非--结束时间
)--停止时间
- 过滤模式
--过滤模式
--日志组名称
是必需的
时间用毫秒(不是秒)表示为历元
呼叫可能如下所示:
$ aws logs filter-log-events \
--start-time 1447167000000 \
--end-time 1447167600000 \
--log-group-name /var/log/syslog \
--filter-pattern ERROR \
--output text
它打印6列以制表符分隔的文本:
- 第一:
(表示该行是日志记录,而不是其他信息)事件
- 第二:
eventId
- 第三:
(记录声明为事件时间的时间)时间戳
- 第四条:
logStreamName
- 第五条:
信息
- 第6条:
摄入时间
2015-11-10T14:50:00Z
到2015-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
它需要人类可读的日期时间,并始终返回带有(空格分隔)列的文本输出:
- 第一个:
logStreamName
- 第二:日期
- 第三:时间
- 第四条直到结束:
消息
pip
需要将安装域声明为可信域,只需再执行几个步骤)
(如果您在最后一个命令中输入了错别字,只需在~/.aws/config
文件中更正即可)
jorgebastida/awslogs
这成为我最喜欢的一个-易于安装,功能强大,易于使用
安装:
$ pip install awslogs
要列出可用的日志组,请执行以下操作:
$ awslogs groups
列出日志流的步骤
$ awslogs streams /var/log/syslog
要获取记录并跟踪记录(查看新记录):
您可以按时间范围过滤记录:
$ awslogs get /var/log/syslog -s 2015-11-10T15:45:00 -e 2015-11-10T15:50:00
从版本0.2.0开始,您还可以使用--过滤器模式
选项
输出包含以下列:
- 第1:日志组名称
- 第二:日志流名称
- 第三条:
消息
--no group
和--no stream
可以关闭前两列
使用--no color
可以在输出中去掉颜色控制字符
编辑:如
awslogs
版本0.2.0添加了--过滤器模式
,文本更新。如果您使用Python Boto3库提取AWS cloudwatch日志。get_log_events()函数接受以毫秒为单位的开始和结束时间
供参考:
为此,您可以使用Datetime和timegm模块获取UTC时间输入并将其转换为毫秒,这样您就可以开始了:
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 input as提供如下所述的输入y:
python flowlog_read.py '2015-11-13 00:00:00' '2015-11-14 00:00:00'
虽然Jan的回答很好,可能也是作者想要的,但请注意,还有一种额外的方式可以通过编程访问日志-via 这适用于始终在线的流式场景,其中数据
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
python flowlog_read.py '2015-11-13 00:00:00' '2015-11-14 00:00:00'