Python的日志记录模块允许模块或类定义自己的记录器。不同的记录器可以有不同的处理程序。其中一些人可能选择登录文件,而有些人则选择登录,例如stdout。
现在我的应用程序使用了其中几个模块,每个模块都有自己的记录器,这些记录器具有各种处理程序。我可以统一日志记录行为,以便所有日志都转到我指定的日志文件吗?换句话说,有没有办法从一个地方一次性地将.config()所有记录器的处理程序?
答案 0 :(得分:15)
您应该查看Python Logging HOWTO以了解其工作原理。
简而言之,所有模块通常都会获得G_LOG = logging.getLogger('package.name')
形式的记录器并向记录器发送消息:G_LOG.info('some message'), G_LOG.exception('something bad happened')
。模块通常不应该配置任何东西。
使用这些模块的应用程序可以根据记录器名称打开日志记录并配置处理程序:
package
或package.name
等的记录器中收听消息最简单的方法是在应用程序开头的某处配置通过logging.basicConfig进行日志记录:
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=log_file, filemode='a')
这样您就可以将所有模块的所有日志消息写入log_file
。
如果您需要更详细的日志记录策略(将来自不同记录器的日志放入不同的文件,或将堆栈跟踪发送到单独的文件),最好定义日志记录配置文件并使用logging.config.dictConfig或{配置日志记录{1}}。
P.S。我通常创建两个记录器作为模块变量:
logging.config.fileConfig
到G_LOG = logging.getLogger(__name__)
ST_LOG = logging.getLogger('stacktrace.' + __name__)
我只发送一行消息。要G_LOG
我使用隐式拥有ST_LOG
的{{1}}复制重要邮件,并写入当前例外的堆栈跟踪。
在应用程序开始时,我加载了一个配置,配置两个记录器(以及两个文件处理程序):一个接收以ST_LOG.exception
开头且有exc_info=True
的消息(即stacktrace消息)在顶部不可见)和处理其余消息的根记录器。我不会把我的完整日志配置文件放在这里,因为它是一个有用的家庭工作,以了解它是如何工作的。
答案 1 :(得分:0)
子记录器将消息传播到与其祖先记录器关联的处理程序。因此,不必为应用程序使用的所有记录器定义和配置处理程序。为顶级记录器配置处理程序并根据需要创建子记录器就足够了。 (不过,您可以通过将记录器的传播属性设置为False来关闭传播。)
当子记录器创建日志条目时,将使用添加到根记录器的任何处理程序。
import logging
root_handler = ...
root_logger = logging.getLogger()
root_logger.addHandler(root_handler) # Will receive all log entries
# Meanwhile in a module...
import logging
logger = logging.getLogger(__name__)
logger.error(...) # Will go to root_handler