本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
CloudWatch 日志代理参考
重要
本节仅供那些使用已弃用的 Log CloudWatch s 代理的用户参考。如果您使用的是实例元数据服务版本 2 (IMDSv2),则必须使用新的统一 CloudWatch 代理。但是,即使您没有使用 IMDSv2,我们也强烈建议您使用较新的统一 CloudWatch 代理,而不是已弃用的 CloudWatch Logs 代理。有关更新的统一 CloudWatch 代理的信息,请参阅使用代理从 Amazon EC2 实例和本地服务器收集指标和日志。 CloudWatch 有关从已弃用的 CloudWatch Logs 代理迁移到统一代理的信息,请使用向导创建 CloudWatch 代理配置文件。
CloudWatch 日志代理提供了一种自动将日志数据从 Amazon EC2 实例发送到 CloudWatch 日志的方法。该代理包括以下组件:
-
的插件,可 AWS CLI 将日志数据推送到 CloudWatch 日志。
-
一个脚本(守护程序),用于启动将数据推送到 Logs 的 CloudWatch 进程。
-
一个确保该守护程序始终运行的 cron 作业。
代理配置文件
CloudWatch 日志代理配置文件描述了 CloudWatch 日志代理所需的信息。代理配置文件的 [general] 一节定义适用于所有日志流的通用配置。[logstream] 一节定义将本地文件发送到远程日志流所必需的信息。您可以有多个 [logstream] 节,但是每一节的名称在该配置文件中都必须唯一,如 [logstream1]、[logstream2] 等等。[logstream] 值和日志文件第一行数据共同定义日志文件的标识。
[general] state_file =
value
logging_config_file =value
use_gzip_http_content_encoding = [true | false] [logstream1] log_group_name =value
log_stream_name =value
datetime_format =value
time_zone = [LOCAL|UTC] file =value
file_fingerprint_lines =integer
|integer
-integer
multi_line_start_pattern =regex
| {datetime_format
} initial_position = [start_of_file | end_of_file] encoding = [ascii|utf_8|..] buffer_duration =integer
batch_count =integer
batch_size =integer
[logstream2] ...
- state_file
-
指定状态文件的存储位置。
- logging_config_file
-
(可选)指定代理日志记录配置文件的位置。如果您未在此处指定代理日志记录配置文件,系统将使用默认文件 awslogs.conf。如果使用脚本安装代理,默认文件位置是
/var/awslogs/etc/awslogs.conf
,如果使用 rpm 安装代理,默认文件位置是/etc/awslogs/awslogs.conf
。该文件采用 Python 配置文件格式(thon.org/2/library/l https://docs.py ogging.config.h logging-config-fileformat tml#)。可自定义具有以下名称的日志记录程序。cwlogs.push cwlogs.push.reader cwlogs.push.publisher cwlogs.push.event cwlogs.push.batch cwlogs.push.stream cwlogs.push.watcher
尽管默认值为 INFO,以下示例仍会将阅读者和发布者的级别更改为 WARNING。
[loggers] keys=root,cwlogs,reader,publisher [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=INFO handlers=consoleHandler [logger_cwlogs] level=INFO handlers=consoleHandler qualname=cwlogs.push propagate=0 [logger_reader] level=WARNING handlers=consoleHandler qualname=cwlogs.push.reader propagate=0 [logger_publisher] level=WARNING handlers=consoleHandler qualname=cwlogs.push.publisher propagate=0 [handler_consoleHandler] class=logging.StreamHandler level=INFO formatter=simpleFormatter args=(sys.stderr,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(process)d - %(threadName)s - %(message)s
- use_gzip_http_content_encoding
-
设置为 true(默认)时,启用 gzip http 内容编码以将压缩的负载发送到 CloudWatch 日志。这样可以降低 CPU 使用率 NetworkOut、降低和减少放置延迟。要禁用此功能,请将 use_gzip_http_content_encoding = false 添加到日志代理配置文件的 [常规] 部分,然后重新启动代理。 CloudWatch
注意
此设置只在 awscli-cwlogs 版本 1.3.3 和更高版本中可用。
- log_group_name
-
指定目标日志组。如果还没有日志组,则会自动创建一个日志组。日志组名称的长度可介于 1 和 512 个字符之间。允许的字符包括 a–z、A–Z、0–9、“_”(下划线)、“-”(连字符)、“/”(正斜杠)和“.”(句点)。
- log_stream_name
-
指定目标日志流。您可以使用文字字符串或预定义的变量({instance_id}、{hostname}、{ip_address}),或这两者的组合来定义日志流名称。如果还没有日志流,则会自动创建一个日志流。
- datetime_format
-
指定如何从日志提取时间戳。时间戳用于检索日志事件和生成指标。如果未提供 datetime_format,则将当前时间用于每个日志事件。如果提供的 datetime_format 值对于给定日志消息无效,则使用时间戳成功解析的最近日志事件的时间戳。如果不存在以前的日志事件,则使用当前时间。
下面列出了常见 datetime_format 代码。您也可以使用 Python datetime.strptime() 支持的所有 datetime_format 代码。时区偏移量 (%z) 也受支持(即使 Python 3.2 之前的版本都不支持它),[+-]HHMM,不带冒号 (:)。有关更多信息,请参阅 strftime() 和 strptime() 行为
。 %y:年份,以零填充的十进制数字表示,不包括代表世纪的数字。00, 01, ..., 99
%Y:年份,以十进制数字形式表示且包括表示世纪的数字。如 1970、1988、2001、2013
%b:月份,使用区域设置的缩写名称形式。Jan、Feb...Dec (en_US);
%B:月份,使用区域设置的完整名称形式。January,February...December (en_US);
%m:月份,使用以零填充的十进制数字形式。01, 02, ..., 12
%d:月份中的日期,使用以零填充的十进制数字形式。01, 02, ..., 31
%H:小时(24 小时制),使用以零填充的十进制数字形式。00, 01, ..., 23
%I:小时(12 小时制),使用以零填充的十进制数字形式。01, 02, ..., 12
%p:区域设置中等效于 AM 或 PM 的表示形式。
%M:分钟,使用以零填充的十进制数字形式。00, 01, ..., 59
%S:秒,使用以零填充的十进制数字形式。00, 01, ..., 59
%f:微秒,在左边使用以零填充的十进制数字形式。000000, ..., 999999
%z:UTC 偏移量,采用 +HHMM 或 -HHMM 形式。+0000、-0400、+1030
示例格式:
Syslog: '%b %d %H:%M:%S', e.g. Jan 23 20:59:29
Log4j: '%d %b %Y %H:%M:%S', e.g. 24 Jan 2014 05:00:00
ISO8601: '%Y-%m-%dT%H:%M:%S%z', e.g. 2014-02-20T05:20:20+0000
- time_zone
-
指定日志事件时间戳的时区。支持的两个值为 UTC 和 LOCAL。默认值为 LOCAL,如果无法基于 datetime_format 推断时区,则将使用此默认值。
- 文件
-
指定要推送到 Lo CloudWatch gs 的日志文件。文件可以指向一个或多个文件(使用通配符,例如/var/log/system.log*)。根据文件修改时间,只有最新的文件才会被推送到 CloudWatch 日志。我们建议您使用通配符指定同一类型的一系列文件(如 access_log.2014-06-01-01、access_log.2014-06-01-02 等)而不是多个类型的文件(如 access_log_80 和 access_log_443)。要指定多个类型的文件,请在配置文件中再添加一个日志流条目,让每一种日志文件转到不同的日志流。不支持压缩文件。
- file_fingerprint_lines
-
指定用于识别文件的行范围。有效值是一个数字或两个用短划线分隔的数字,如“1”、“2-5”。默认值是“1”,因此第一行用于计算指纹。除非所有指定的行都可用,否则指纹线不会发送到 CloudWatch 日志。
- multi_line_start_pattern
-
指定用于识别日志消息开头的模式。日志消息由与模式匹配的行以及与模式不匹配的任何以下行组成。有效值为正则表达式或 {datetime_format}。使用 {datetime_format} 时,应指定 datetime_format 选项。默认值为“^[^\s]”,因此以非空格字符开头的任何行都会使上一个日志消息结束,并开始新的日志消息。
- initial_position
-
指定从何处开始读取数据(start_of_file 或 end_of_file)。默认位置是 start_of_file。仅当日志流没有持续状态时才会使用它。
- 编码
-
指定日志文件的编码,以便正确读取该文件。默认编码为 utf_8。Python codecs.decode() 支持的编码可在此处使用。
警告
指定错误的编码可能导致数据丢失,因为无法解码的字符将被其他字符替代。
以下是一些常见编码:
ascii, big5, big5hkscs, cp037, cp424, cp437, cp500, cp720, cp737, cp775, cp850, cp852, cp855, cp856, cp857, cp858, cp860, cp861, cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp875, cp932, cp949, cp950, cp1006, cp1026, cp1140, cp1250, cp1251, cp1252, cp1253, cp1254, cp1255, cp1256, cp1257, cp1258, euc_jp, euc_jis_2004, euc_jisx0213, euc_kr, gb2312, gbk, gb18030, hz, iso2022_jp, iso2022_jp_1, iso2022_jp_2, iso2022_jp_2004, iso2022_jp_3, iso2022_jp_ext, iso2022_kr, latin_1, iso8859_2, iso8859_3, iso8859_4, iso8859_5, iso8859_6, iso8859_7, iso8859_8, iso8859_9, iso8859_10, iso8859_13, iso8859_14, iso8859_15, iso8859_16, johab, koi8_r, koi8_u, mac_cyrillic, mac_greek, mac_iceland, mac_latin2, mac_roman, mac_turkish, ptcp154, shift_jis, shift_jis_2004, shift_jisx0213, utf_32, utf_32_be, utf_32_le, utf_16, utf_16_be, utf_16_le, utf_7, utf_8, utf_8_sig
- buffer_duration
-
指定日志事件批量处理的时间段。最小值为 5000ms,默认值为 5000ms。
- batch_count
-
指定批处理中的日志事件的最大数量(最大为 10000)。默认值是 10000。
- batch_size
-
指定批处理中的日志事件的最大大小(以字节为单位,最大为 1048576 字节)。默认值为 1048576 字节。此大小的计算方式是 UTF-8 格式的所有事件消息之和加上代表每个日志事件的 26 字节。
使用带有 HTTP 代理的 CloudWatch 日志代理
您可以将 CloudWatch 日志代理与 HTTP 代理一起使用。
注意
awslogs-agent-setup.py 版本 1.3.8 或更高版本支持 HTTP 代理。
将 CloudWatch 日志代理与 HTTP 代理配合使用
-
请执行以下操作之一:
-
要全新安装 CloudWatch Logs 代理,请运行以下命令:
curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
sudo python awslogs-agent-setup.py --region
us-east-1
--http-proxyhttp://your/proxy
--https-proxyhttp://your/proxy
--no-proxy 169.254.169.254要在 EC2实例上保持对亚马逊 EC2 元数据服务的访问权限,请使用 --no-proxy 169.254.169.254(推荐)。有关更多信息,请参阅 Amazon 用户指南中的实例元数据和 EC2 用户数据。
在
http-proxy
和https-proxy
的值中,您指定完整 URL。 -
要安装现有的 CloudWatch Logs 代理,请编辑/ var/awslogs/etc/proxy .conf,然后添加您的代理:
HTTP_PROXY= HTTPS_PROXY= NO_PROXY=
-
-
重新启动代理以使更改生效:
sudo service awslogs restart
如果您使用的是 Amazon Linux 2,请使用以下命令重新启动代理:
sudo service awslogsd restart
划分 CloudWatch 日志代理配置文件
如果您在 awscli-cwlogs 1.3.3 或更高版本中使用 awslogs-agent-setup .py 版本 1.3.8 或更高版本,则可以通过在//目录中创建其他配置文件来为各种组件独立导入不同的流配置。var/awslogs/etc/config当 CloudWatch Logs 代理启动时,它会在这些附加配置文件中包含所有流配置。[常规] 部分中的配置属性必须在主配置文件中定义 (/var/awslogs/etc/awslogs.conf) and are ignored in any additional configuration files found in /var/awslogs/etc/config/.
如果因为使用 rpm 安装代理而没有 var/awslogs/etc/config//目录,则可以改用 etc/awslogs/config//目录。
重新启动代理以使更改生效:
sudo service awslogs restart
如果您使用的是 Amazon Linux 2,请使用以下命令重新启动代理:
sudo service awslogsd restart
CloudWatch 日志代理常见问题解答
- 支持哪些类型的文件轮换?
-
支持以下文件轮换机制:
-
用数字后缀为现有日志文件命名,然后重新创建原始的空日志文件。例如,/var/log/syslog.log is renamed /var/log/syslog.log.1. If /var/log/syslog.log.1 already exists from a previous rotation, it is renamed /var/log/syslog.log.2。
-
在创建副本后截断原始日志文件。例如,/var/log/syslog.log is copied to /var/log/syslog.log.1 and /var/log/syslog.log 被截断。这种情况下可能会有数据丢失,因此请谨慎使用这种文件轮换机制。
-
使用与旧文件相同的通用模式创建新文件。例如,/var/log/syslog.log.2014-01-01 remains and /var/log/syslog.log.2014-01-02 已创建。
文件的指纹(源 ID)是通过将日志流键和文件内容第一行进行哈希处理计算得到的。要覆盖此行为,可以使用 file_fingerprint_lines 选项。当文件进行轮换时,新文件应该有新内容,旧文件不应追加内容;代理将在完成旧文件的读取后推送新文件。
-
- 如何确定我使用的是哪个版本的代理?
-
如果您使用安装脚本来安装 CloudWatch Logs 代理,则可以使用/var/awslogs/bin/awslogs-version.sh 来检查您使用的代理版本。它会打印代理的版本及其主要依赖关系。如果你使用 yum 安装 CloudWatch 日志代理,你可以使用 “yum info awslogs” 和 “yum info aws-cli-plugin-cloudwatch -logs” 来检查 Logs 代理和插件的版本。 CloudWatch
- 日志条目如何转换为日志事件?
-
日志事件包含两个属性:事件发生时的时间戳,以及原始日志消息。默认情况下,以非空格字符开头的任何行都会使上一个日志消息结束(如果存在),并开始新的日志消息。要覆盖此行为,可以使用 multi_line_start_pattern,与模式匹配的任何行都开始新的日志消息。模式可以是任何正则表达式或“{datetime_format}”。例如,如果每个日志消息的第一行都包含类似于“2014-01-02T13:13:01Z”的时间戳,则 multi_line_start_pattern 可以设置为“\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z”。要简化配置,可以在指定 datetime_format 选项的情况下使用“{datetime_format}”变量。对于同一个示例,如果 datetime_format 设置为“%Y-%m-%dT%H:%M:%S%z”,则 multi_line_start_pattern 可以仅仅是“{datetime_format}”。
如果未提供 datetime_format,则将当前时间用于每个日志事件。如果提供的 datetime_format 对于给定日志消息无效,则使用时间戳成功解析的最近日志事件的时间戳。如果不存在以前的日志事件,则使用当前时间。当日志事件回退到当前时间或上一个日志事件的时间时,会记录一个警告消息。
时间戳用于检索日志事件和生成指标,因此,如果您指定错误的格式,则可能无法检索日志事件,生成错误的指标。
- 日志事件如何批处理?
-
满足以下任意条件时,表示批次已满并且将发布:
-
从添加第一个日志事件以来,时间已经过了 buffer_duration。
-
累积的日志事件小于 batch_size,但添加新的日志事件则会超出 batch_size。
-
日志事件的数量已达到 batch_count。
-
批处理中的日志事件的时间跨度不超过 24 小时,但添加新日志事件会超出 24 小时的限制。
-
- 什么原因可能导致跳过或截断日志条目、日志事件或批次?
-
为遵循
PutLogEvents
操作的限制,需注意,以下问题可能导致跳过日志事件或批次。注意
跳过数据时,Log CloudWatch s 代理会在其日志中写入警告。
-
如果日志事件的大小超过 256 KB,则将完全跳过日志事件。
-
如果日志事件的时间戳晚于未来 2 小时,则跳过日志事件。
-
如果日志事件的时间戳早于过去 14 天,则跳过日志事件。
-
如果任何日志事件的存在时间超过日志组的保留期,则跳过整个批次。
-
如果单个
PutLogEvents
请求中的一批日志事件时间跨度超过 24 小时,则PutLogEvents
操作将失败。
-
- 停止代理会导致数据丢失/重复条目吗?
-
只要状态文件可用,且从上次运行以来没有发生文件轮换,则不会。 CloudWatch Logs 代理可以从其停止的地方开始并继续推送日志数据。
- 我可以将来自相同或不同主机的不同日志文件指向同一个日志流吗?
-
不支持配置多个日志源将数据发送到单个日志流。
- 代理调用哪些 API(或我应该将哪些操作添加到 IAM 策略中)?
-
CloudWatch 日志代理需要
CreateLogGroup
、CreateLogStream
DescribeLogStreams
、和PutLogEvents
操作。如果您使用最新的代理,则不需要DescribeLogStreams
。请参阅以下 IAM 策略示例。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
- 我不想让 L CloudWatch ogs 代理自动创建日志组或日志流。我如何阻止代理重新创建日志组和日志流?
-
在您的 IAM 策略中,您可以限制该代理仅执行以下操作:
DescribeLogStreams
和PutLogEvents
。在撤销代理的
CreateLogGroup
和CreateLogStream
权限之前,请确保创建希望代理使用的日志组和日志流。如果日志代理没有CreateLogGroup
和CreateLogStream
权限,它将无法在您创建的日志组中创建日志流。 - 在进行故障排除时我应当查看哪些日志?
-
代理安装日志位于
/var/log/awslogs-agent-setup.log
,代理日志位于/var/log/awslogs.log
。