簡體   English   中英

如何獲取當前的日志格式化程序?

[英]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.

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