作者:empty 出版社:empty |
处理日志处理器的阻塞有时候需要让日志处理程序在不阻塞当前正在记录线程的情况下完成工作, 这在Web应用程序中很常见,当然也会在其他场景中出现。一个常见的缓慢行为是SMTPHand1er:由于开发者无法控制的多种原因(例如, 性能不佳的邮件或网络基础架构),发送电子邮件可能需要很长时间,其实几乎所有基于网络的处理程序都可能造成阻塞:即便是Sec ket Handler也可能在底层进行DNS查询, 这太慢了(这个查询会深人至套接字代码, 位于Python层之下, 这是不受开发者控制的) 。一种解决方案是分成两部分去处理.第一部分,针对那些对性能有要求的关键线程的日志记录附加一个Queue Handler.日志记录器只需简单写人队列, 该队列可以设置一个足够大的容量甚至不设置容量上限.通常写人队列是一个快速的操作, 即使可能需要在代码中去捕获例如queue.Full等异常.如果你是一名处理关键线程的开发者, 请务必记录这些信息(包括建议只为志处理器附加Queue Handler a)以便于其他开发者使用你的代码.解决方案的另一部分是Queue Listener, 它被设计用来作为Queue Handler的对应.Queue Listener非常简单:向其传人一个队列和一些处理句柄, 它会启动一个内部线程来监听从Queue Handlers(或任何其他可用的Log Records源) 发送过来的Log Records队列.Log Records会从队列中被移除,并被传递给句柄进行处理。使用一个单独的类Qu cue Listener优点是可以使用同一个实例去服务于多个“Queue Handlers 。这样会更节省资源,否则每个处理程序都占用一个线程没有任何益处,以下是使用了这样两个类的示例(省略了导人语句):
请注意, 在某些情况下序列化会存在一些安全。如果这影响到你, 那么你可以通过覆盖make Pickle()方法,使用自己的实现来解决,并调整上述脚本也使用覆盖后的序列化方法。8在日志记录中添加上下文信息有时,除了传递给日志记录器调用的参数外,我们还希望日志记录中包含上下文信息,例如,有一个网络应用,可能需要记录一些特殊的客户端信息在日志中(比如客户端的用户名,IP地址等),虽然你可以通过设置额外的参数去达到这个目的,但这种方式不一定方便。或者你可能想到在每个连接的基础上创建一个Logger的实例, 但这些实例是不会被垃圾回收的, 这在练习中也许不是问题, 但当Logger的实例数量取决于你应用程序中想记录的细致程度时, 如果Logger的实例数量不受限制的话, 将会变得难以管理,8.1使用日志适配器传递上下文信息一个传递上下文信息和日志事件信息的简单办法是使用类Lagger Adapter。这个类设计的像Logger,所以可以直接调用debug、info(l.warning t.error O、exception O、critical() 和log() , 这些方法在对应的Logger中使用相同的签名, 所以可以交替使用两种类型的实例。当你创建一个Logger Adapter的实例时, 你会传人一个Logger的实例和一个包含了上下文信息的字典对象, 当你调用一个Logger Adapter实例的方法时,它会把调用委托给内部的Logger的实例, 并为其整理相关的上下文信息。这是Logger Adapter的一个代码片段: