Python 多个记录器不工作。如何配置多个不同级别的记录器?

Python multiple loggers not working. How to configure multiple loggers with different levels?

我正在尝试配置两个记录器,一个记录器用于 INFO 级别,另一个记录器用于 DEBUG 级别。我希望 DEBUG 内容只转到我的日志文件,我希望 INFO 内容既转到日志文件又转到控制台。请看下面的代码。没有任何内容写入我的文件,也没有任何内容显示在控制台中。

logFileDir = os.path.join(os.getcwd(), '.logs')
if not os.path.exists(logFileDir):
    os.mkdir(logFileDir)
infoLogFileDir = os.path.join(logFileDir, 'INFO')
if not os.path.exists(infoLogFileDir):
    os.mkdir(infoLogFileDir)
debugLogFileDir = os.path.join(logFileDir, 'DEBUG')
if not os.path.exists(debugLogFileDir):
    os.mkdir(debugLogFileDir)
LOG_FORMAT = ("%(asctime)s [%(levelname)s]: %(message)s in %(pathname)s:%(lineno)d")

#DEBUG LOGGER
debugLogFileName = os.path.join(debugLogFileDir, 'EFDebugLog.log')
debugLogger = logging.getLogger("debugLogger")
debugLogger.setLevel(logging.DEBUG)
debugHandler = logging.handlers.RotatingFileHandler(filename=debugLogFileName,maxBytes=5000000, backupCount=100)
debugHandler.setLevel(logging.DEBUG)
debugHandler.setFormatter(Formatter(LOG_FORMAT))
debugLogger.addHandler(debugHandler)

#INFO LOGGER
infoLogFileName = os.path.join(infoLogFileDir, 'EFInfoLog.log')
infoLogger = logging.getLogger("infoLogger")
infoLogger.setLevel(logging.INFO)
infoHandler = logging.handlers.RotatingFileHandler(filename=infoLogFileName,maxBytes=5000000, backupCount=100)
infoHandler.setLevel(logging.INFO)
infoHandler.setFormatter(Formatter(LOG_FORMAT))
infoLogger.addHandler(infoHandler)
infoLogger.addHandler(logging.StreamHandler())

您正在调用的 logging.* 函数记录到根记录器。这就是为什么您看不到任何输出的原因;您还没有为根记录器配置任何处理程序。您只为您自己的记录器配置了处理程序,您没有使用它。

如果你想使用logging.*的功能,你需要先配置根记录器,你可以通过不带任何参数调用getLogger来获得。所以代码可能看起来像:

import logging
import logging.handlers


root_logger = logging.getLogger()

info_handler = logging.handlers.RotatingFileHandler(filename='infolog.txt')
info_handler.setLevel(logging.INFO)

stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)

debug_handler = logging.handlers.RotatingFileHandler(filename='debuglog.txt')
debug_handler.setLevel(logging.DEBUG)

root_logger.addHandler(stream_handler)
root_logger.addHandler(debug_handler)
root_logger.addHandler(info_handler)

# this is needed, since the severity is WARNING by default,
# i.e. it would not log any debug messages
root_logger.setLevel(logging.DEBUG)

root_logger.debug('this is a debug message')
root_logger.info('this is an info message')