python:logging.config --- 日志记录配置
配置函数
下列函数可配置 logging 模块。 它们位于 logging.config 模块中。 它们的使用是可选的 — 要配置 logging 模块你可以使用这些函数,也可以通过调用主 API (在 logging 本身定义) 并定义在 logging 或 logging.handlers 中声明的处理器。
logging.config.dictConfig(config)
从一个字典获取日志记录配置。 字典的内容描述见下文的 配置字典架构。
如果在配置期间遇到错误,此函数将引发 ValueError, TypeError, AttributeError 或 ImportError 并附带适当的描述性消息。 下面是将会引发错误的(可能不完整的)条件列表:
level 不是字符串或者不是对应于实际日志记录级别的字符串。
propagate 值不是布尔类型。
id 没有对应的目标。
在增量调用期间发现不存在的处理器 id。
无效的日志记录器名称。
无法解析为内部或外部对象。
解析由 DictConfigurator 类执行,该类的构造器可传入用于配置的字典,并且具有 configure() 方法。 logging.config 模块具有可调用属性 dictConfigClass,其初始值设为 DictConfigurator。 你可以使用你自己的适当实现来替换 dictConfigClass 的值。
dictConfig() 会调用 dictConfigClass 并传入指定的字典,然后在所返回的对象上调用 configure() 方法以使配置生效:
def dictConfig(config):
dictConfigClass(config).configure()
例如,DictConfigurator 的子类可以在它自己的 init() 中调用 DictConfigurator.init(),然后设置可以在后续 configure() 调用中使用的自定义前缀。 dictConfigClass 将被绑定到这个新的子类,然后就可以与在默认的未定制状态下完全相同的方式调用 dictConfig()。
3.2 新版功能.
logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True, encoding=None)
从一个 configparser 格式文件中读取日志记录配置。 文件格式应当与 配置文件格式 中的描述一致。 此函数可在应用程序中被多次调用,以允许最终用户在多个预设配置中进行选择(如果开发者提供了展示选项并加载选定配置的机制)。
参数
fname – 一个文件名,或一个文件类对象,或是一个派生自 RawConfigParser 的实例。 如果传入了一个派生自 RawConfigParser 的实例,它会被原样使用。 否则,将会实例化一个 Configparser,并且它会从作为 fname 传入的对象中读取配置。 如果存在 readline() 方法,则它会被当作一个文件类对象并使用 read_file() 来读取;在其它情况下,它会被当作一个文件名并传递给 read()。
defaults – 要传递给 ConfigParser 的默认值可在此参数中指定。
disable_existing_loggers – 如果指定为 False,则当执行此调用时已存在的日志记录器会被保持启用。 默认值为 True 因为这将以向下兼容的方式启用旧有行为。 此行为是禁用任何已存在的非根日志记录器除非它们或它们的上级在日志配置中被显式地指定。 :param encoding: 当 fname 为文件名时用于打开文件的编码格式。
在 3.4 版更改: 现在接受 RawConfigParser 子类的实例作为 fname 的值。 这有助于:
使用一个配置文件,其中日志记录配置只是全部应用程序配置的一部分。
使用从一个文件读取的配置,它随后会在被传给 fileConfig 之前由使用配置的应用程序来修改(例如基于命令行参数或运行时环境的其他部分)。
3.10 新版功能: 增加了 encoding 形参。
logging.config.listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None)
在指定的端口上启动套接字服务器,并监听新的配置。 如果未指定端口,则会使用模块默认的 DEFAULT_LOGGING_CONFIG_PORT。 日志记录配置将作为适合由 dictConfig() 或 fileConfig() 进行处理的文件来发送。 返回一个 Thread 实例,你可以在该实例上调用 start() 来启动服务器,对该服务器你可以在适当的时候执行 join()。 要停止该服务器,请调用 stopListening()。
如果指定 verify 参数,则它应当是一个可调用对象,该对象应当验证通过套接字接收的字节数据是否有效且应被处理。 这可以通过对通过套接字发送的内容进行加密和/或签名来完成,这样 verify 可调用对象就能执行签名验证和/或解密。 verify 可调用对象的调用会附带一个参数 —— 通过套接字接收的字节数据 —— 并应当返回要处理的字节数据,或者返回 None 来指明这些字节数据应当被丢弃。 返回的字节数据可以与传入的字节数据相同(例如在只执行验证的时候),或者也可以完全不同(例如在可能执行了解密的时候)。
要将配置发送到套接字,请读取配置文件并将其作为字节序列发送到套接字,字节序列要以使用 struct.pack(‘>L’, n) 打包为二进制格式的四字节长度的字符串打头。
备注 因为配置的各部分是通过 eval() 传递的,使用此函数可能让用户面临安全风险。虽然此函数仅绑定到 localhost 上的套接字,因此并不接受来自远端机器的连接,但在某些场景中不受信任的代码可以在调用 listen() 的进程的账户下运行。具体来说,如果如果调用 listen() 的进程在用户无法彼此信任的多用户机器上运行,则恶意用户就能简单地通过连接到受害者的 listen() 套接字并发送运行攻击者想在受害者的进程上执行的任何代码的配置的方式,安排运行几乎任意的代码。如果是使用默认端口这会特别容易做到,即便使用了不同端口也不难做到。要避免发生这种情况的风险,请在 listen() 中使用 verify 参数来防止未经认可的配置被应用。
在 3.4 版更改: 添加了 verify 参数。
备注 如果你希望将配置发送给未禁用现有日志记录器的监听器,你将需要使用 JSON 格式的配置,该格式将使用 dictConfig() 进行配置。 此方法允许你在你发送的配置中将 disable_existing_loggers 指定为 False。
logging.config.stopListening()
停止通过对 li