CloudWatch 記錄用戶端參考 - Amazon CloudWatch Logs

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CloudWatch 記錄用戶端參考

重要

本節是使用已取代 CloudWatch 記錄代理程式的使用者的參考資料。如果您使用執行個體中繼資料服務版本 2 (IMDSv2),則必須使用新的整合 CloudWatch 代理程式。不過,即使您沒有使用IMDSv2,我們強烈建議您使用較新的統一 CloudWatch 代理程式,而不要使用已淘汰的 CloudWatch Logs 代理程式。如需更新整合 CloudWatch 代理程式的相關資訊,請參閱使用 CloudWatch 代理程式從 Amazon EC2 執行個體和現場部署伺服器收集指標和日誌。如需從已取代的 CloudWatch Logs 代理程式移轉至整合代理程式的相關資訊,請使用精靈建立 CloudWatch 代理程式組態檔案

CloudWatch 日誌代理程式提供了一種自動化方式,可將 CloudWatch 日誌資料從 Amazon EC2 執行個體傳送到日誌。代理程式包含下列元件:

  • 將記錄資料推送至 CloudWatch 記錄檔的 AWS CLI 外掛程式。

  • 啟動程序以將資料推送至 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 配置文件格式(這個 .org/2 /庫/記錄 https://docs.py .config. logging-config-fileformat html#)。您可以自訂具有以下名稱的記錄器。

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

以下範例會將讀取器和發行者的層級變更為,WARNING而預設值為INFO。

[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、降低並減少 put 延遲。若要停用此功能,請將 use_gzip_http_content_encoding = 假新增至 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_format 代碼、datetime.strptime()。即使在 python 3.2 之前不支持它,[+-] HHMM 沒有冒號(:),也支持時區偏移量(%z)。如需詳細資訊,請參閱 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,如果無法根據 date time_format 推斷時區,則會使用此選項。

file

指定您要推送至記錄檔的記 CloudWatch 錄檔。檔案可指向特定檔案或多個檔案 (使用萬用字元,例如 /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

指定批次中的日誌事件最大數量,最多可達 10,000。預設值為 10000。

batch_size

指定批次中的日誌事件最大大小,以位元組為單位,最多可達 1048576 位元組。預設值為 1048576 位元組。此大小的計算方式為 UTF -8 中所有事件訊息的總和,加上每個記錄事件的 26 個位元組。

搭配代理伺服器使用 CloudWatch 記錄HTTP代理程式

您可以將 CloudWatch 記錄代理程式與HTTP代理伺服器搭配使用。

注意

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

將 CloudWatch 記錄代理程式與 HTTP Proxy 搭配使用
  1. 執行以下任意一項:

    1. 對於 Lo CloudWatch gs 代理程式的新安裝,請執行下列命令:

      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-proxy http://your/proxy --https-proxy http://your/proxy --no-proxy 169.254.169.254

      若要維護EC2執行個體上 Amazon 中EC2繼資料服務的存取權,請使用無代理 169.254.169.254 (建議使用)。如需詳細資訊,請參閱 Amazon 使用者指南中的執行個體中繼資料和EC2使用者資料。

      在和的值中 http-proxyhttps-proxy,您可以指定整個URL。

    2. 對於 CloudWatch 日誌代理程式的現有安裝,請編輯 /var/awslogs/etc/proxy.conf,然後新增您的代理伺服器:

      HTTP_PROXY= HTTPS_PROXY= NO_PROXY=
  2. 重新啟動代理程式,讓變更生效:

    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 代理程式啟動時,會在這些額外的設定檔中包含任何串流組態。[general] 區段中的組態屬性必須在主要組態檔案 (/var/awslogs/etc/awslogs.conf) 中定義,並且在 /var/awslogs/etc/config/ 中的任何額外的組態檔案中被忽略。

如果您因為使用 rpm 安裝代理程式,因此沒有 /var/awslogs/etc/config/ 目錄,您可以改為使用 /etc/awslogs/config/ 目錄。

重新啟動代理程式,讓變更生效:

sudo service awslogs restart

如果您使用的是 Amazon Linux 2,請使用下列命令來重新啟動代理程式:

sudo service awslogsd restart

CloudWatch 日誌代理 FAQ

支援哪些種類的檔案輪換?

支援以下檔案輪換機制:

  • 以數值尾碼重新命名現有的日誌檔,然後重新建立原始的空日誌檔。例如,/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 記錄代理程式,您可以使用 /var/awslogs/bin/awslogs-version.sh 來檢查您所使用的代理程式版本。它會列印出代理程式的版本及其主要相依性。如果你使用 yum 來安裝 CloudWatch 日誌代理程式,你可以使用 「yum info awslog」「yum info aws-cli-plugin-cloudwatch-日誌」來檢查日 CloudWatch 誌代理程式和外掛程式的版本。

日誌項目如何轉換為日誌事件?

日誌事件包含兩個屬性:事件發生時的時間戳記,以及原始日誌訊息。依據預設,開頭使用非空白字元的任何列皆可結束之前的日誌訊息 (如果有的話),並開始新的日誌訊息。若要覆寫此行為,可以使用 multi_line_start_pattern,符合此模式的任何列都會開始新的日誌訊息。此模式可以是任何 regex 或「{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 option,您可以使用「{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 操作會失敗。

停用代理程式是否會造成資料遺失/重複?

只要有狀態檔案,而且從上次執行之後未發生檔案輪換,就不會造成資料遺失/重複。Lo CloudWatch gs 代理程式可以從停止的位置開始,並繼續推送記錄檔資料。

我是否可以從相同或不同的主機,將不同的日誌檔指向相同的日誌串流?

不支援設定多個日誌來源,將資料傳送到單個日誌串流。

代理程式會進行哪些API呼叫 (或我應該將哪些動作新增至我的IAM政策)?

記 CloudWatch 錄代理程式需要CreateLogGroupCreateLogStreamDescribeLogStreams、和PutLogEvents作業。如果您使用的是最新的代理程式,則不需要 DescribeLogStreams。請參閱以下 IAM 政策範例。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
我不想讓 CloudWatch Logs 代理程式自動建立記錄群組或記錄資料流。我要如何防止代理程式重新建立日誌群組與日誌串流?

在您的IAM政策中,您可以將代理程式限制為僅執行下列作業:DescribeLogStreamsPutLogEvents

從代理程式撤銷 CreateLogGroupCreateLogStream 許可前,請務必建立您要讓代理程式使用的日誌群組和日誌串流。日誌代理程式無法在您已建立的日誌群組中建立日誌串流,除非其擁有 CreateLogGroupCreateLogStream 許可。

進行故障排除時,我應該查看哪些日誌?

代理程式安裝日誌位於 /var/log/awslogs-agent-setup.log,代理程式日誌位於 /var/log/awslogs.log