簡體   English   中英

Python日志記錄 - 如何繼承根記錄器級別和處理程序

[英]Python Logging - How to inherit root logger level & handler

我是一個python新手,試圖實現登錄我的代碼。 我有兩個模塊

main.py submodule.py

main.py

import logging
from logging.handlers import RotatingFileHandler
import submodule


import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug('DEBUG LEVEL - MAIN MODULE')
logger.info('INFO LEVEL - MAIN MODULE')

submodule.loggerCall()

submodule.py

import logging
from logging.handlers import RotatingFileHandler


def loggerCall():
    logger = logging.getLogger(__name__)
#    logger.setLevel(logging.DEBUG)

    fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    logger.addHandler(fh)

    logger.debug('SUBMODULE: DEBUG LOGGING MODE : ')
    logger.info('Submodule: INFO LOG')

    return

我認為,當我從子模塊調用getLogger時,它應該從root logger繼承日志級別和處理程序詳細信息。 但是,在我的情況下,我必須在子模塊中再次指定日志級別和處理程序,以使它們打印到相同的日志文件。

另外,如果我的子模塊中有很多方法和類。 如何在不必再次定義日志級別和處理程序的情況下進行操作。

想法是根據主模塊中設置的日志級別,將主模塊和子模塊打印在同一日志中的單個日志文件。

提前致謝

對不起,因為這可能是一個重復的問題,我確實經歷了那些類似的問題,但無法弄清楚這是如何工作的。 因此發布這個問題。 我不是故意創建一個重復的bcz我沒有查找它。

這里的問題是你沒有初始化根記錄器; 您正在初始化主模塊的記錄器。

試試這個main.py:

import logging
from logging.handlers import RotatingFileHandler
import submodule

logger = logging.getLogger()  # Gets the root logger
logger.setLevel(logging.DEBUG)

fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug('DEBUG LEVEL - MAIN MODULE')
logger.info('INFO LEVEL - MAIN MODULE')

submodule.loggerCall()

然后嘗試使用submodule.py:

def loggerCall():
    logger = logging.getLogger(__name__)
    logger.debug('SUBMODULE: DEBUG LOGGING MODE : ')
    logger.info('Submodule: INFO LOG')
    return

由於您說要將所有子模塊中的日志消息發送到同一位置,因此應初始化根記錄器,然后只需使用消息記錄方法(以及setlevel()調用)。 因為你的子模塊沒有顯式處理程序,所以logging.getLogger(__name__)將遍歷樹到根,在那里它將找到你在main.py中建立的處理程序。

暫無
暫無

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

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