有没有办法1)过滤和2)通过API或CLI从Cloudwatch中检索原始日志数据?我需要从Cloudwatch中提取一部分日志事件进行分析。
我不需要创建指标或类似的东西。这是针对特定事件的历史研究。
我已经进入了控制台中的日志查看器,但我试图拉出特定的行来告诉我一段时间的故事。日志查看器几乎不可能用于此目的。如果我有实际的日志文件,我只会grep并在大约3秒内完成。但我没有。
澄清
在Cloudwatch Logs的说明中,它说:“您可以查看原始日志数据(仅在网络视图中?),以便在需要时查看问题的根源。只要您需要使用高度耐用,低成本的存储,就可以存储和访问(仅在Web视图中?),因此您不必担心填满硬盘驱动器。“ - 是我的 如果此控制台视图是获取源数据的唯一方法,那么通过Cloudwatch存储日志对我来说不是一个可接受的解决方案。我需要以足够的灵活性来获取实际数据来搜索模式,而不是点击几十页的行并复制/粘贴。但是,似乎无法获得更好的获取源数据的方法。
答案 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服务的官方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列制表符分隔文本:
EVENTS
(表示该行是日志记录而非其他信息)eventId
timestamp
(记录为活动时间宣布的时间)logStreamName
message
ingestionTime
因此,如果您手头有Linux命令行实用程序,并且只关注从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插件更易于使用:
$ 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
date
time
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
选项。
输出包含列:
message
使用--no-group
和--no-stream
,您可以关闭前两列。
使用--no-color
可能会消除输出中的颜色控制字符。
编辑:正如awslogs
版本0.2.0添加--filter-pattern
,文字已更新。
答案 1 :(得分:1)
如果您使用Python Boto3库来提取AWS cloudwatch日志。 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。
中所述