Amazon CloudWatch Logs
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

CloudWatch Logs 代理参考

CloudWatch Logs 代理提供一种从 Amazon EC2 实例将日志数据发送到 CloudWatch Logs 的自动化方式。该代理包括以下组件:

  • 一个将日志数据推送到 CloudWatch Logs 的 AWS CLI 插件。

  • 一个启动进程以将数据推送到 CloudWatch Logs 的脚本 (守护程序)。

  • 一个确保该守护程序始终运行的 cron 作业。

代理配置文件

CloudWatch Logs 代理配置文件描述 CloudWatch Logs 代理需要的信息。代理配置文件的 [general] 一节定义适用于所有日志流的通用配置。[logstream] 一节定义将本地文件发送到远程日志流所必需的信息。您可以有多个 [logstream] 节,但是每一节的名称在该配置文件中都必须唯一,如 [logstream1]、[logstream2] 等等。[logstream] 值和日志文件第一行数据共同定义日志文件的标识。

Copy
[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

(可选) 指定代理日志记录配置文件的位置。如果您未在此处指定代理日志记录配置文件,系统将使用 /etc/awslogs/awslogs.conf 处的默认文件。此文件采用 Python 配置文件格式 (https://docs.python.org/2/library/logging.config.html#logging-config-fileformat)。可自定义具有以下名称的日志记录程序。

Copy
cwlogs.push cwlogs.push.reader cwlogs.push.publisher cwlogs.push.event cwlogs.push.batch cwlogs.push.stream cwlogs.push.watcher

尽管默认值为 INFO,以下示例仍会将阅读者和发布者的级别更改为 WARNING。

Copy
[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 Logs。这可以降低 CPU 使用率,减少 NetworkOut,并降低放入延迟。要禁用此功能,请在 CloudWatch Logs 代理配置文件的 [general] 节中添加 use_gzip_http_content_encoding = false,然后重新启动代理。

注意

此设置只在 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:使用 +HHMM 或 -HHMM 形式的 UTC 偏移量。+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 推断时区,则将使用此默认值。

文件

指定您要推送到 CloudWatch Logs 的日志文件。File 可以指向一个特定文件或多个文件 (使用通配符,如 /var/log/system.log*)。根据文件修改时间,只有最新文件才会推送到 CloudWatch Logs。我们建议您使用通配符指定同一类型的一系列文件 (如 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 Logs。

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)。默认值是 1000。

batch_size

指定批处理中的日志事件的最大大小 (以字节为单位,最大为 1048576 字节)。默认值为 32768 字节。此大小的计算方式是 UTF-8 格式的所有事件消息之和加上代表每个日志事件的 26 字节。

结合使用 CloudWatch Logs 代理与 HTTP 代理

您可以将 CloudWatch Logs 代理与 HTTP 代理结合使用。

注意

在 awslogs-agent-setup.py 版本 1.3.8 或更高版本中支持 HTTP 代理。

结合使用 CloudWatch Logs 代理与 HTTP 代理

  1. 执行以下任一操作:

    1. 对于新安装的 CloudWatch Logs 代理,请运行以下命令:

      Copy
      curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
      Copy
      sudo python awslogs-agent-setup.py --region us-east-1 --http-proxy http://your/proxy --https-proxy http://your-proxy --no-proxy 169.254.169.254

      为了维护在 EC2 实例上对 Amazon EC2 元数据服务的访问,请使用 --no-proxy 169.254.169.254 (推荐)。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的实例元数据和用户数据

    2. 对于 CloudWatch Logs 代理的现有安装,请编辑 /var/awslogs/etc/proxy.conf,然后添加您的代理:

      Copy
      HTTP_PROXY= HTTPS_PROXY= NO_PROXY=
  2. 重新启动代理以使更改生效:

    Copy
    sudo service awslogs restart

划分 CloudWatch Logs 代理配置文件

如果您正在将 awslogs-agent-setup.py 版本 1.3.8 或更高版本与 awscli-cwlogs 1.3.3 或更高版本结合使用,可以通过在 /var/awslogs/etc/config/ 目录中创建额外配置文件,独立于其他组件来导入各种组件的不同流配置。在 CloudWatch Logs 代理启动时,将在这些额外的配置文件中包含所有流配置。[general] 节中的配置属性必须在主配置文件 (/var/awslogs/etc/awslogs.conf) 中定义,并且在 /var/awslogs/etc/config/ 中找到的任何额外配置文件中将被忽略。

重新启动代理以使更改生效:

Copy
sudo service awslogs restart

CloudWatch Logs 代理常见问题

支持哪些类型的文件轮换?

支持以下文件轮换机制:

  • 用数字后缀为现有日志文件命名,然后重新创建原始的空日志文件。例如,/var/log/syslog.log 重命名为 /var/log/syslog.log.1。如果 /var/log/syslog.log.1 从上次轮换起就已存在,则重命名为 /var/log/syslog.log.2。

  • 在创建副本后截断原始日志文件。例如,/var/log/syslog.log 复制到 /var/log/syslog.log.1,会截断 /var/log/syslog.log。这种情况下可能会有数据丢失,因此请谨慎使用这种文件轮换机制。

  • 使用与旧文件相同的通用模式创建新文件。例如,/var/log/syslog.log.2014-01-01 仍然保留,将创建 /var/log/syslog.log.2014-01-02。

文件的指纹 (源 ID) 是通过将日志流键和文件内容第一行进行哈希处理计算得到的。要覆盖此行为,可以使用 file_fingerprint_lines 选项。当文件进行轮换时,新文件应该有新内容,旧文件不应追加内容;代理将在完成旧文件的读取后推送新文件。

如何确定我使用的是哪个版本的代理?

如果您使用设置脚本安装了 CloudWatch Logs 代理,则可以使用 /var/awslogs/bin/awslogs-version.sh 来检查您使用的是哪个版本的代理。它会打印代理的版本及其主要依赖关系。如果您用 yum 安装了 CloudWatch Logs 代理,则可以使用“yum info awslogs”“yum info aws-cli-plugin-cloudwatch-logs”来检查 CloudWatch Logs 代理和插件的版本。

日志条目如何转换为日志事件?

日志事件包含两个属性:事件发生时的时间戳,以及原始日志消息。默认情况下,以非空格字符开头的任何行都会使上一个日志消息结束 (如果存在),并开始新的日志消息。要覆盖此行为,可以使用 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 对于给定日志消息无效,则使用时间戳成功解析的最近日志事件的时间戳。如果不存在以前的日志事件,则使用当前时间。当日志事件回退到当前时间或上一个日志事件的时间时,会记录一个警告消息。

时间戳用于检索日志事件和生成指标,因此,如果您指定错误的格式,则可能无法检索日志事件,生成错误的指标。

日志事件如何批处理?

满足以下任意条件时,表示批次已满并且将发布:

  1. 从添加第一个日志事件以来,时间已经过了 buffer_duration

  2. 累积的日志事件小于 batch_size,但添加新的日志事件则会超出 batch_size

  3. 日志事件的数量已达到 batch_count

  4. 批处理中的日志事件的时间跨度不超过 24 小时,但添加新日志事件会超出 24 小时的限制。

什么原因可能导致跳过或截断日志条目、日志事件或批次?

为遵循 PutLogEvents 操作的限制,需注意,以下问题可能导致跳过日志事件或批次。

注意

当跳过数据时,CloudWatch Logs 代理在其日志中写入一条警告。

  1. 如果日志事件的大小超过 256 KB,则将完全跳过日志事件。

  2. 如果日志事件的时间戳晚于未来 2 小时,则跳过日志事件。

  3. 如果日志事件的时间戳早于过去 14 天,则跳过日志事件。

  4. 如果任何日志事件的存在时间超过日志组的保留期,则跳过整个批次。

  5. 如果单个 PutLogEvents 请求中的一批日志事件时间跨度超过 24 小时,则 PutLogEvents 操作将失败。

停止代理会导致数据丢失/重复条目吗?

只要状态文件可用,且从上次运行以来没有发生文件轮换,则不会。CloudWatch Logs 代理可以从它停止的地方启动,并继续推送日志数据。

我可以将来自相同或不同主机的不同日志文件指向同一个日志流吗?

不支持配置多个日志源将数据发送到单个日志流。

代理调用哪些 API (或我应该将哪些操作添加到 IAM 策略中)?

CloudWatch Logs 代理需要 CreateLogGroupCreateLogStreamDescribeLogStreamsPutLogEvents 操作。如果您使用最新的代理,则不需要 DescribeLogStreams。请参阅以下 IAM 策略示例。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws-cn:logs:*:*:*" ] } ] }
我不希望 CloudWatch Logs 代理自动创建日志组或日志流。我如何阻止代理重新创建日志组和日志流?

在您的 IAM 策略中,您可以限制该代理仅执行以下操作:DescribeLogStreamsPutLogEvents

在进行故障排除时我应当查看哪些日志?

代理安装日志位于 /var/log/awslogs-agent-setup.log,代理日志位于 /var/log/awslogs.log