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,它就应该从根记录器继承日志级别和处理程序详细信息。但是,就我而言,我必须在子模块中再次指定日志级别和处理程序,以将它们打印到同一个日志文件。
此外,如果我有很多方法,并且 类 在我的子模块中。我怎样才能做到这一点而不必再次定义我的日志级别和处理程序。
想法是根据主模块中设置的日志级别,在同一个日志中打印主模块和子模块的日志文件。
提前致谢
抱歉,这可能是一个重复的问题,我确实回答了那些类似的问题,但无法弄清楚它是如何工作的。因此发布这个问题。我不是故意创建重复的 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.
中建立的处理程序
我是 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,它就应该从根记录器继承日志级别和处理程序详细信息。但是,就我而言,我必须在子模块中再次指定日志级别和处理程序,以将它们打印到同一个日志文件。
此外,如果我有很多方法,并且 类 在我的子模块中。我怎样才能做到这一点而不必再次定义我的日志级别和处理程序。
想法是根据主模块中设置的日志级别,在同一个日志中打印主模块和子模块的日志文件。
提前致谢
抱歉,这可能是一个重复的问题,我确实回答了那些类似的问题,但无法弄清楚它是如何工作的。因此发布这个问题。我不是故意创建重复的 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.