Python的日志记录模块允许模块或类定义自己的记录器.不同的记录器可以有不同的处理程序.他们中的一些人可能选择登录文件,而有些人则选择登录,例如stdout.
现在,我的应用程序使用了其中几个模块,每个模块都有自己的记录器,这些记录器具有各种处 我可以统一日志记录行为,以便所有日志都转到我指定的日志文件吗?换句话说,有没有办法从一个地方同时将.config()所有记录器的处理程序?
new*_*ver 17
您应该查看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')
Run Code Online (Sandbox Code Playgroud)
这样您就可以将所有模块的所有日志消息写入log_file.
如果您需要更详细的日志记录策略(将来自不同记录器的日志放入不同的文件,或将堆栈跟踪发送到单独的文件),最好使用logging.config.dictConfig或定义日志记录配置文件并配置日志记录logging.config.fileConfig.
PS我通常创建两个记录器作为模块变量:
G_LOG = logging.getLogger(__name__)
ST_LOG = logging.getLogger('stacktrace.' + __name__)
Run Code Online (Sandbox Code Playgroud)
要G_LOG我只发送一个在线的消息.要ST_LOG我重复使用的重要信息ST_LOG.exception,其隐含有exc_info=True和写入当前异常的堆栈跟踪.
在应用程序的启动予加载配置了两个记录器(和两个文件处理程序它们)的结构包括:一个接收与启动消息stacktrace,并且具有propagate=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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6015 次 |
| 最近记录: |