[英]Can't show info level logging in AWS Lambda
我正在嘗試在 AWS lambda 中運行腳本,並且我希望在腳本運行后將 output 信息級別日志記錄到控制台。 我曾嘗試從這篇關於使用 lambda 中的日志的帖子中尋求幫助,但沒有成功。 我認為 AWS Cloudwatch 正在覆蓋我如下所示的配置。
import logging
# log configuration
logging.basicConfig(
format='%(levelname)s: %(message)s',
level=logging.INFO,
encoding="utf-8"
)
我想將日志記錄級別設置為 logging.info。 我怎樣才能做到這一點? 運行時間為 python 3.9
根據我的理解,我認為一種解決方法是添加以下內容:
logging.getLogger().setLevel('INFO')
我相信logging.basicConfig(level=...)
會影響日志顯示在控制台中的最低日志級別,但會影響所有記錄器。 上面的一個顯式設置了根記錄器的最低啟用級別,即logging.getLogger()
。 每個記錄器的啟用級別決定了將在什么級別記錄消息 - 否則,每次調用記錄器方法(如logging.info
)基本上都是空操作。
所以本質上, basicConfig
和setLevel
調用是分開的,但它們一起工作以確定庫的日志是否打印到控制台。 例如,您可以設置basicConfig(level='DEBUG')
以便打印出所有庫的調試級別日志。 但是如果你想為一個像botocore
這樣的庫做一個例外,你可以使用logging.getLogger('botocore').setLevel('WARNING')
,這會將那個庫的最低啟用級別設置為警告,所以只有該庫記錄的高於最低級別的消息才會打印到控制台。
您實際上需要知道 Python 在 lambdas 中登錄有點奇怪 - 如果您使用默認的日志記錄模塊,當調用 lambda 並且它開始啟動其后端時,它會在那里創建一個日志記錄處理程序並將其附加到日志組的名稱作為處理程序名稱——不是 basicConfig 在創建日志處理程序時默認使用的名稱屬性
因此,basicConfig,試圖根據名稱屬性修改處理程序,找不到由 lambda 調用啟動創建的處理程序,因此將無法更新您的設置,就像在您的頂級 lambda 處理程序文件中一樣,因為它當您使用 getLogger 和 setLevel 您自己設置該處理程序時,可以在其級別(在 lambda 中)看到一個日志記錄處理程序
因此,如果您只使用 getLogger() 它會在最頂層(lambda 處理程序及其文件)工作,因為 lambda_handler 被導入到后端代碼中運行,因此它可以找到處理程序。
然而,任何進一步的導入都將尋找 lambda_handler 的名稱路徑,並將它們的日志處理程序附加到該名稱路徑——這意味着它們的日志語句不會出現在雲監視中。
我找到了三種解決方案:
在 lambda 處理程序及其文件中使用 logger = getLogger() 和 setLevel - 您導入的任何其他文件,不要使用 getLogger - 而只是使用import logging - logging.INFO(message)
強制記錄器查找默認處理程序和使用它(注意:這不是主意,您最終會失去對日志文件的很多控制
如果你不能使用任何額外的庫,那么你必須在你的 lambda 處理程序中編寫一些代碼來查看當前的日志記錄處理程序是否存在 - 如果存在,抓住它並根據需要調整它以填充導入的 rest 。 您可以找到散布在 SO 周圍的代碼
如果可以(我通常不喜歡說使用這個庫的答案,所以即使我喜歡這個庫,這也是答案三)使用 aws_lambda_powertools 及其模塊 Logger - 這是一個非常強大的日志記錄模塊,旨在與您現有的日志記錄一起使用python 中的語句和 aws 處理程序 - 以及 aws 自己的開源項目 python。 除了記錄器之外,它還有很多很棒的工具,但記錄器非常非常棒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.