2017-08-04 91 views
0

是否可以使用Python Lambda中的JSON Log Format登錄到CloudWatch?從Python lambda中使用JSON日誌格式

我想創建一個指標來監測通過我的lambda的數據,並且extracting data form JSON Log Events看起來非常合適。

我記錄如下:

logger.info(dict(items=len(records), max_latency=max_latency)) 

日誌顯示了對CloudWatch的,因爲這:

[INFO] 2017-08-04T16:20:23.579Z some-uuid {'items': 1, 'max_latency': 1219403.5792706013} 

但是當我嘗試創建一個度量標準與此:

{ $.max_latency = * } 

CloudWatch告訴我:

Found 0 matches out of 29 event(s) in the sample log. 
+0

我在Lambda NodeJS中遇到同樣的問題。我正在記錄JSON事件,如{message:「這是一些錯誤日誌」,級別:「錯誤」}。如上所述,CloudWatch日誌將顯示帶有前綴時間戳和uuid的事件。你能分享你最終解決這個問題的方式嗎? –

+0

我遇到的問題是我的JSON無效JSON。我的JSON沒有「」鍵。 – Juliano

回答

0

日誌條目有2個問題:

  • 的JSON被Python產生了單引號(')鑰匙,而不是雙引號("),CloudWatch的,如果它使用"只能識別它。
  • 正如@ user615501指出的那樣,整個日誌消息必須是JSON。

由於lambda表達式容易CPU綁定,並且我的JSON是超級簡單,我去的是這樣:

print('{"items": ' + str(len(records)) + ', "max_latency":' + str(max_latency) + '}') 

,輸出:

{"items": 1, "max_latency": 1219403.5792706013} 

它的工作,我可以成功過濾與{ $.max_latency = * }並使用$.max_latency作爲度量值。

1

我很確定問題在於你在syslog格式的日誌消息中提供了一些JSON格式的數據。您可能需要完全使用JSON進行日誌記錄,將[INFO]標籤,時間戳和uuid移動到JSON文檔中。

使用基本配置,您可以提供格式參數,該參數不包括JSON文檔之外的數據。

+0

我想你給我畫了一張爲什麼它不起作用的圖片。我可以直接想象如何使用'boto3'來做到這一點,但是可以在lambda內使用python的'logger'或'print'語句來做到這一點嗎?我想避免添加對CloudWatchLogs API的調用,因爲我認爲它會減慢我的lambda。 – Juliano

+0

嘗試檢查文檔中的結構化日誌記錄:https://docs.python.org/2/howto/logging-cookbook.html#implementing-structured-logging – user615501