[英]Python logging - How to get value of logging message that has a custom formatter
[英]How to get current logging formatter?
我正在使用 python 標准庫中的日志記錄模塊,並希望獲得當前的Formatter
。 原因是我正在使用multiprocessing
模塊,並且對於每個進程,我想為其記錄器分配另一個文件處理程序以記錄到它自己的日志文件。 當我通過以下方式執行此操作時
logger = logging.getLogger('subprocess')
log_path = 'log.txt'
with open(log_path, 'a') as outfile:
handler = logging.StreamHandler(outfile)
logger.addHandler(handler)
log.txt
中的消息根本沒有格式,但我希望消息的格式與我的典型日志記錄格式相同。 我的典型日志記錄設置如下所示
logging.basicConfig(
format='%(asctime)s | %(levelname)s | %(name)s - %(process)d | %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=os.environ.get('LOGLEVEL', 'INFO').upper(),
)
logger = logging.getLogger(__name__)
由於看起來Formatter
程序 object 與Handler
程序 object 相關聯,因此我嘗試從主Logger
object 獲取具有正確格式的處理程序。 所以我打電話
logger.handlers
但我有一個空列表[]
。
所以我的問題是,我在哪里可以得到Formatter
與我的主記錄器相同的格式器 object?
作為記錄,我在 macOS 上使用 python 3.8,但代碼將部署到 Linux(但仍然是 python 3.8)。
從logging.basicConfig
上的cpython
源代碼來看,似乎包含您的格式化字符串的格式化程序 object 最終被添加到傳遞給根記錄器的處理程序中(參見: here )。 因此,您可以通過執行從根記錄器 object 獲取處理程序(以及格式化程序)
logging.root.handlers[0].formatter
特別是,要實現問題中的子進程日志記錄處理程序,您可以這樣做
handler = logging.StreamHandler(outfile)
handler.setFormatter(logging.root.handlers[0].formatter)
handler.setLevel(logging.root.level)
logger.addHandler(handler)
這會將您的處理程序設置為與通常的記錄器對象相同的記錄格式(和級別)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.