簡體   English   中英

Python 登錄模塊未按預期工作

[英]Python logging in modules not working as expected

我確信我只是誤解了它是如何工作的,但我似乎無法將日志格式傳播到登錄模塊,除非模塊“知道”調用它的模塊的名稱。

下面的代碼演示了這個問題。 下面的代碼有效,但我必須對調用它的模塊的名稱進行硬編碼才能應用格式。

應用程序.py

import logging
import mymodule

logger = logging.getLogger('app')
log_formatter = logging.Formatter(f'%(asctime)s %(name)s[%(process)d]: %(levelname)s - %(message)s\n')
log_handler_console = logging.StreamHandler()
log_handler_console.setFormatter(log_formatter)
log_handler_console.terminator = ''
logger.addHandler(log_handler_console)

logger.error('testing 1')
mymodule.dosomething()

模塊.py

import logging
logger = logging.getLogger('app.module')
def dosomething():
    logger.error('testing 2')

根據上面的代碼,我得到了這個:

2022-01-09 19:01:53,986 app[46541]: ERROR - testing 1
2022-01-09 19:01:53,987 app.module[46541]: ERROR - testing 2

但是如果我將記錄器的名稱更改為例如“測試”,我會得到:

2022-01-09 19:21:07,590 app[46580]: ERROR - testing 1
testing 2

如果我將 module.py 第 2 行中的記錄器名稱更改為“app”或“app.something”以外的任何名稱,則格式不再適用。 我知道 inheritance 是如何工作的(我認為)但是我怎么能在不硬編碼的情況下知道調用模塊的名稱呢? 我確實在這里看到了一些關於 SO 的例子,但警告說這是一個壞主意。

本質上,我想做的是在主應用程序中定義日志格式,並讓主應用程序調用的任何模塊都使用相同的格式。 我瘋了嗎? 似乎是一件顯而易見的事情?

您所期望的,“本質上我想做的是在主應用程序中定義日志格式,並讓主應用程序調用的任何模塊都使用相同的格式。”,是完全合理的。

“我怎么能在不硬編碼的情況下知道調用模塊的名稱呢?” 您可以使用以下代碼設置類似於 Python package 層次結構的記錄器名稱層次結構。

logger = logging.getLogger(__name__)

默認情況下在所有子記錄器上啟用傳播,所有過濾的消息將通過層次結構向上傳播,最后傳播到根記錄器,然后由其處理程序以其指定格式處理。

關於使用Python logging的那些做法更詳細的解釋,可以參考Good Practices of using Python Logging

實際上,當我仍在試圖弄清楚這一點時,我已經為自己找到了答案。 而不是刪除這個問題,我想我會為遇到這個問題的其他人回答這個問題。

替換兩個實例(即,在主應用程序和模塊中)

logger = logging.getLogger('something')

logger = logging.getLogger()

創建了一個“根”記錄器,一切都按我的預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM