logging.handlers记录处理程序

源代码: Lib / logging / handlers.py


包中提供了以下有用的处理程序。请注意,StreamHandler, FileHandler中实际定义了三个处理程序NullHandlerlogging模块本身,但这里已经记录了其他处理程序.

 

StreamHandler

StreamHandler类,位于核心logging包中,发送日志输出到sys.stdout, sys.stderr或类似任何文件的对象(或更确切地说,支持write()flush()方法的任何对象).

class logging.StreamHandlerstream=None
返回StreamHandler类的新实例。如果stream如果指定,实例将使用它来记录输出;否则,sys.stderr将被使用.

emit (record )
如果指定了格式化程序,则用于格式化记录。然后使用终结符将记录写入流中。如果存在异常信息,则使用traceback.print_exception()并且流到了溪流上
flush
通过调用它flush()方法。注意close()方法继承自Handler并没有输出,所以一个明确的flush()有时可能需要调用.
setStream(stream)
将实例的流设置为指定值,如果不同。旧流在新流之前刷新设置了

参数: – 处理程序应该使用的流
返回: 旧流,如果流改变了,或None如果不是.

版本3.7.

在版本3.2中更改:StreamHandler班级现在有terminator属性,defaultvalue "\n",将格式化的记录写入流时用作终止符。如果你不想要这个新行终止,你可以设置处理程序实例的terminator属性为空字符串。在早期版本中,终结符被硬编码为"\n".

 

FileHandler

FileHandler类,位于核心logging包中,发送将输出记录到磁盘文件。它继承了StreamHandler.

class logging.FileHandlerfilename, mode=”a”, encoding=None, delay=False)的输出功能
返回FileHandler类的新实例。打开指定的文件并将其用作日志记录的流。如果没有指定mode,则使用"a"。如果encoding不是None,则用于打开带有该编码的文件。如果delay为真,那么文件打开将推迟到第一次调用emit()。默认情况下,文件无限增长.

更改版本3.6:除了字符串值,Path对象也接受filename参数。

close
关闭文件.
emit (record)
将记录输出到档案.

 

NullHandler

新版本3.1.

NullHandler班,位于核心logging包,不做任何格式化或输出。它实际上是图书馆开发人员使用的“无操作”处理程序.

class logging.NullHandler
返回NullHandler类。

emitrecord
这个方法什么都不做.
handlerecord
这个方法什么都不做.
createLock
这个方法返回None对于锁定,因为存在需要序列化访问的nounderlying I / O.

查看配置库的日志有关如何使用的更多信息NullHandler.

 

WatchedFileHandler

位于WatchedFileHandler模块中的logging.handlers类是FileHandler,它监视它正在登录的文件。如果文件发生变化,则关闭并使用文件名重新打开.

由于使用newsysloglogrotate执行日志文件轮换。这个处理程序,打算在Unix / Linux下使用,监视文件以查看自上次发出后它是否已更改。(如果文件的设备或inode已更改,则认为文件已更改。)如果文件已更改,则旧文件流关闭,文件打开以重新获得流量

此处理程序不适合在Windows下使用,因为在Windowsopen日志文件中无法移动或重命名 – 日志记录打开文件具有锁定 – 因此不需要这样的处理程序。此外,ST_INOWindows不支持;stat()总是返回zerofor这个值.

class logging.handlers.WatchedFileHandlerfilename, mode=”a”, encoding=None, delay=False
返回WatchedFileHandler类。打开指定的文件并将其用作日志记录的流。如果没有指定mode,则使用"a"。如果encoding不是None,则用于打开带有该编码的文件。如果delay是的,然后将文件打开推迟到第一次调用emit()。默认情况下,文件无限增长.

更改版本3.6:除了字符串值,Path参数也可以接受filename对象.

reopenIfNeeded (
检查文件是否已更改。如果有,则刷新并关闭现有流并再次打开文件,通常作为将记录输出到文件的前兆.

新版本3.6.

emit (record
将记录输出到文件中,但是如果文件已经改变,首先调用reopenIfNeeded()来重新打开文件.

 

BaseRotatingHandler

BaseRotatingHandler class,位于logging.handlers模块中,是旋转文件处理程序的基类,RotatingFileHandlerTimedRotatingFileHandler。你不应该需要实例化这个类,但它有你可能需要覆盖的属性和方法.

class logging.handlers.BaseRotatingHandler (filename, mode, encoding=None, delay=False)
参数是FileHandler。属性为:

namer
如果此属性设置为可调用,则rotation_filename()方法委托给此可调用对象。传递给callable的参数传递到rotation_filename().

注意

在翻转期间,命名函数被调用了很多次,所以它应该尽可能简单和快速。对于给定的输入,它应该每次都输出相同的输出,否则按摩行为可能无法正常工作.

3.3版本中的新功能

rotator
如果此属性设置为可调用,则rotate() methoddelegates to this callable。传递给callable的参数传递给rotate().

版本3.3.

rotation_filename(default_name)
旋转时修改日志文件的文件名。

提供这样可以提供自定义文件名.

默认实现调用处理程序的’namer’属性,如果它是可调用的,则将默认名称传递给它。如果属性不可调用(默认为None),则名称将保持不变.

Parameters: default_name – 默认名称日志文件

新版本3.3.

rotate (source, dest)
旋转时,旋转当前日志

默认实现调用处理程序的’rotator’属性,如果它是可调用的,则将source和dest参数传递给它。如果属性不可调用(默认为None),源代码简单到目的地.

Parameters:
  • source – 源文件名。这通常是基本文件名,例如“test.log中” .
  • DEST – 目标文件名。这通常是源旋转到的,例如,’test.log.1′.

版本3.3.

存在属性的原因是为了节省你必须的子类 – 你可以对RotatingFileHandlerTimedRotatingFileHandler。如果namer或rotator callableraises一个异常,这将在与emit()打电话,即通过handleError()处理程序的方法

如果需要对旋转处理进行更重要的更改,可以使用方法.

例如,请参阅使用旋转器和命名器来自定义日志旋转处理.

 

RotatingFileHandler

RotatingFileHandler类位于logging.handlers模块中,支持旋转磁盘日志文件。

class logging.handlers.RotatingFileHandlerfilename, mode=”a”, maxBytes=0, backupCount=0, encoding=None, delay=False
返回RotatingFileHandler类的新实例。打开指定的文件并将其用作日志记录的流。如果没有指定mode,则使用"a"。如果encoding不是None,则用于打开带有该编码的文件。如果delay为真,那么文件打开将推迟到第一次调用emit()。默认情况下,文件无限增长.

您可以使用maxBytesbackupCount值来允许文件以预定大小rollover。当要超过大小时,将关闭文件并静默打开一个新文件以进行输出。只要当前日志文件的长度接近maxBytes,就会发生翻转;但是如果maxBytesbackupCount中的任何一个为零,则不会发生翻转,所以你通常要把backupCount设置为至少1,并且非零maxBytes。什么时候 backupCount如果非零,系统将通过将扩展名“.1”,“。2”等附加到文件名来保存旧的日志文件。例如,backupCount为5,基本文件名为app.log,你会得到app.log,app.log.1, app.log.2,最多为app.log.5。被写入的文件总是app.log。当这个文件被填满时,它被关闭并重命名为app.log.1,如果存在文件app.log.1,app.log.2等,则它们分别被重命名为app.log.2,app.log.3等.

在版本3.6中更改:除了字符串值,Path参数也可以接受filename对象.

doRollover
翻滚,如上所述.
emit (record)
将记录输出到文件中,如前所述,为翻转提供服务。

 

TimedRotatingFileHandler

TimedRotatingFileHandler类,位于logging.handlers模块中,支持以一定的时间间隔旋转磁盘日志文件.

class logging.handlers.TimedRotatingFileHandlerfilename, when=”h”, interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None
返回TimedRotatingFileHandler类。打开指定的文件并将其用作日志记录流。在旋转时,alsosets是文件名后缀。根据wheninterval.

的乘积进行旋转你可以使用when来指定interval的类型。可能值列表如下。请注意它们不区分大小写.

Value 间隔类型 如果/如何atTime使用
"S" 忽略
"M" 分钟 忽略
"H" 小时 忽略
"D" 忽略
"W0"-"W6" 工作日(0 =星期一) 用于计算初始滚动时间
"midnight" 如果没有指定atTime则在午夜翻身,否则在时间atTime 用于计算初始滚动时间

使用基于工作日的轮换时,为星期一指定’W0’,为星期二指定’W1’,依此指定为星期日的’W6’。在这种情况下,没有使用interval传递的值.

系统将通过附加文件名的扩展名来保存旧的日志文件。扩展名是基于日期和时间的,使用strftime格式%Y-%m-%d_%H-%M-%S或者它的前导部分,取决于隔离间隔.

当第一次计算下一个翻转时间时(当创建句柄时),现有日志文件的最后修改时间,或者当前时间是,用于计算下一次旋转的时间.

如果utc参数为真,则使用UTC时间;使用其他时间.

如果backupCount非零,最多backupCount将保留文件,如果发生翻转时会创建更多,则删除oldestone。删除逻辑使用间隔来确定要删除的文件,因此更改间隔可能会留下旧文件.

如果delay为真,则文件打开延迟到第一次调用emit().

如果atTime不是None,它必须是datetime.time实例,它指定发生翻转的时间,对于发生翻转的情况“在午夜“或”特定的工作日“。注意,在这种情况下,atTime value有效地用于计算initial翻转和随后的翻转将通过正常间隔计算来计算.

注意

当handleris初始化时,计算初始翻转时间。后续翻转时间的计算仅在发生翻转时进行,并且仅在发出输出时发生翻转。如果不记得这一点,可能会导致一些混乱。例如,如果设置了“每分钟”的间隔,那么这并不意味着您将看到日志文件的时间(在文件名中)以分钟隔开;如果在应用程序执行期间,日志输出的生成频率高于每分钟一次,then你可以看到日志文件的时间相隔一分钟。另一方面,如果记录消息仅每五分钟输出一次(比如说),那么文件时间中的间隙将对应于没有输出(因此发生转换)的分钟数.

更改版本3.4:atTime参数已添加.

更改版本3.6:除了字符串值,Path对象也被接受为filename argument.

doRollover ( )
翻滚,如上所述.
emit (record)
将记录输出到文件中,如上所述进行翻转.

 

SocketHandler

SocketHandler班,位于logging.handlers模块,将日志输出发送到网络套接字。基类使用TCP套接字

class logging.handlers.SocketHandler// (host, port)
返回SocketHandler用于与远程机器通信的类,其地址由hostport.

给出。在版本3.4中更改:如果port指定为None,使用host中的值创建一个Unix域套接字 – 否则,创建一个TCP套接字.

close ()
关闭套接字.
emit
修补记录的属性字典并将其写入socket二进制格式。如果套接字出错,请以静默方式丢弃该数据包。如果先前已丢失连接,请重新建立连接。将接收端的记录打开到LogRecord,使用makeLogRecord()功能
handleError ()
处理emit()期间发生的错误。最可能的原因是连接丢失。关闭套接字,以便我们可以在下一个事件上重试.
makeSocket
这是一个工厂方法,它允许子类定义他们想要的套接字的精确类型。默认实现创建一个TCP套接字(socket.SOCK_STREAM).
makePickle(record)
使用lengthprefix以二进制格式挑选记录的属性字典,并将其准备好通过套接字传输.

请注意,泡菜不是完全安全的。如果您担心安全性,可能需要覆盖此方法以实现更安全的机制。例如,您可以使用HMAC对泡菜进行签名,然后在接收端验证它们,或者您也可以禁用接收端上的全局对象的取消.

send (packet )
将酸洗的字符串packet发送到套接字。此功能允许在网络繁忙时发生的部分发送.
createSocket ()
要创建套接字;失败时,使用指数退避算法。在初始失败时,处理程序将丢弃它正在发送的消息。当后续消息由同一实例处理时,它将不会尝试连接,直到经过一段时间。默认参数使得初始延迟是一秒,如果此延迟之后仍然无法建立连接,则处理程序将每次最多延迟30秒延迟.

此行为由以下处理程序属性控制:

  • retryStart(初始延迟,默认为1.0秒).
  • retryFactor(乘数,默认为2.0).
  • retryMax(最大延迟,默认为30.0秒).

这意味着如果远程监听器启动after处理程序已被使用,您可能会丢失消息(因为处理程序甚至不会尝试连接,直到延迟已经已经过了,但只是在延迟期间默默地丢弃消息).

 

DatagramHandler

位于DatagramHandler模块中的logging.handlers类继承自SocketHandler支持发送日志消息,即UDP套接字

class logging.handlers.DatagramHandler (host, port)
返回DatagramHandler类的新实例,用于与远程机器进行通信其地址由hostport.

在版本3.4中更改:如果port指定为None,则为Unix域套接字使用host中的值创建 – 否则,创建一个UDP套接字

emit ( )
修补记录的属性字典并将其写入socket二进制格式。如果套接字出错,请以静默方式丢弃该数据包。要将接收端的记录打开到LogRecord,请使用makeLogRecord()功能
makeSocket ()
工厂方法SocketHandler在这里被覆盖以创建一个UDP套接字(socket.SOCK_DGRAM).
send(s)
将一根腌渍的字符串发送到一个插座.

 

SysLogHandler

SysLogHandler类,位于logging.handlers模块中,支持将日志消息发送到远程或本地Unix系统日志.

class logging.handlers.SysLogHandleraddress=(“localhost”, SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM
返回SysLogHandler类的新实例,该类与远程Unix机器进行通信,其地址由address给出一个(host, port)元组。如果没有指定address,则使用("localhost", 514)。该地址用于打开套接字。提供(host, port)元组的替代方法是提供astring的地址,例如’/ dev / log’。在这种情况下,使用Unix域套接字将消息发送到syslog。如果没有指定facilityLOG_USER用来。打开的套接字类型取决于socktype参数,默认为socket.SOCK_DGRAM,因此打开UDP套接字。要打开TCP套接字(用于较新的syslogdaemons,如rsyslog),请指定值socket.SOCK_STREAM.

请注意,如果您的服务器未在UDP端口514上侦听,则SysLogHandler可能看起来不是工作。在这种情况下,检查你应该用于域套接字的地址 – 它取决于系统。例如,在Linux上它通常是’/ dev / log’但在OS / X上它是’/ var / run / syslog’。您需要检查您的平台并使用适当的地址(如果您的应用程序需要在多个平台上运行,则可能需要在运行时进行此检查)。在Windows上,你几乎不得不使用UDP选项.

在版本3.2中更改:socktype已添加.

close ( )
关闭套接字到远程主机.
emit(record)
记录已格式化,然后发送到syslog服务器。如果存在异常信息,则not被发送到服务器.

更改版本3.2.1:(参见:bpo-12168。)在早期版本中,发送到syslog守护进程的消息总是以NUL字节终止,因为这些守护进程的早期转换期望NUL终止消息 – 尽管它不在相关规范中( RFC 5424 )。这些守护进程的更多近期转换并不期望NUL字节,但它会将其剥离,甚至更新的守护进程(更紧密地遵循RFC 5424)将NUL字节作为消息的一部分传递.

在面对所有相关的守护进程行为时,可以更轻松地处理syslog消息,通过使用类级别属性append_nul,可以配置NUL字节的附加。这默认为True(保留现有行为),但可以在False instancein上设置为SysLogHandler,为该实例添加not附加NUL终止符。

在版本3.3中更改:(参见:bpo-12419。)在早期版本中,没有设施“ident”或“tag”前缀来标识消息的来源。现在可以使用类级别属性指定它,默认为""以保留现有行为,但可以在SysLogHandler实例上覆盖,以便该实例将ident添加到处理的每个消息中。请注意,提供的ident必须是文本,而不是字节,并且完全按照原样添加到消息中.

encodePriority (facility, priority)
将设施和优先级编码为整数。您可以传入字符串或整数 – 如果传递字符串,则使用内部映射字典将它们转换为整数.

符号LOG_值在SysLogHandler中定义并且镜像定义的值在sys/syslog.h头文件中

Priorities

Name(字符串) 符号值
alert LOG_ALERT
critcritical LOG_CRIT
debug LOG_DEBUG
emergpanic LOG_EMERG
errerror LOG_ERR
info LOG_INFO
notice LOG_NOTICE
warnwarning LOG_WARNING

设施

名称(字符串) 符号值
auth LOG_AUTH
authpriv LOG_AUTHPRIV
cron LOG_CRON
daemon LOG_DAEMON
ftp LOG_FTP
kern LOG_KERN
lpr LOG_LPR
mail LOG_MAIL
news LOG_NEWS
syslog LOG_SYSLOG
user LOG_USER
uucp LOG_UUCP
local0 LOG_LOCAL0
local1 LOG_LOCAL1
local2 LOG_LOCAL2
local3 LOG_LOCAL3
local4 LOG_LOCAL4
local5 LOG_LOCAL5
local6 LOG_LOCAL6
local7 LOG_LOCAL7
mapPrioritylevelname
将日志记录级别名称映射到syslog优先级名称。如果使用自定义级别,或者使用默认算法,则可能需要覆盖此名称不适合您的需求。默认算法将DEBUG, INFO, WARNING, ERRORCRITICAL映射到等效的syslog名称,将所有其他级别名称映射到’warning’.

 

NTEventLogHandler

NTEventLogHandler class,位于logging.handlers模块中,支持将日志消息发送到本地Windows NT,Windows 2000或Windows XP事件日志。在你可以使用它之前,你需要安装Mark Hammond的Win32extensions for Python .

class logging.handlers.NTEventLogHandler (appname, dllname=None, logtype=”Application”)
返回NTEventLogHandler类的新实例。appname用于定义事件日志中显示的应用程序名称。使用此名称创建适当的注册表项。dllname应该提供.dll或.exe的完全限定路径名,其中包含要保留在日志中的messagedefinitions(如果没有指定,则使用"win32service.pyd"-这是随Win32扩展而安装的并包含一些基本持有者消息定义。请注意,使用这些占位符会使您的事件日志变大,因为整个消息源都保存在日志中。如果您想要更细的日志,则必须传入您自己的.dll或.exe的名称,其中包含要在事件日志中使用的消息定义)。logtype"Application", "System""Security"中的一个,并且是"Application".

close
此时,您可以从注册表中删除应用程序名称作为事件日志条目的源。但是,如果执行此操作,您将无法按照预期在事件日志查看器中查看事件 – 它需要能够访问注册表以获取.dll名称。目前的版本不这样做.
emitrecord
确定消息ID,事件类别和事件类型,然后在NT事件日志中记录消息.
getEventCategory (record)
返回记录的事件类别。如果要指定自己的类别,请覆盖此项。此版本返回0.
getEventType (record)
返回记录的事件类型。如果要指定自己的类型,请覆盖此项。这个版本使用handler’stypemap属性进行映射,该属性在__init__()到包含DEBUG, INFO,WARNING, ERRORCRITICAL的映射的字典。如果您正在使用自己的级别,则需要覆盖此方法或在处理程序的typemapattribute.
getMessageID(record)
返回记录的消息ID。如果你使用自己的消息,你可以通过msg传递给记录器的是IDrather而不是格式字符串。然后,在这里,您可以使用dictionarylookup来获取消息ID。此版本返回1,这是win32service.pyd.

 

SMTPHandler

位于SMTPHandler模块中的logging.handlers类支持通过SMTP将日志消息发送到电子邮件地址.

class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0
返回SMTPHandler类。该实例使用电子邮件的from和to地址以及主题行初始化。该toaddrs应该是一个字符串列表。要指定非标准SMTP端口,请使用mailhost论点。如果使用字符串,则使用标准SMTP端口。如果您的SMTP服务器需要身份验证,您可以为credentials参数

要指定使用安全协议(TLS),请将元组传入secure论点。只有在提供身份验证凭据时才会使用此选项。元组应该是空元组,或者是具有密钥文件名称的单值元组,或者是具有密钥文件和证书文件名称的2值元组。(此元组传递给smtplib.SMTP.starttls()方法。)

可以使用timeout参数指定与SMTP服务器通信的超时.

新在版本3.3:添加了timeout参数.

emit (record)
格式化并将其发送到指定的addressees.
getSubject(record)
如果你想指定一个依赖于记录的主题行,请改写这个方法.

 

MemoryHandler

MemoryHandler类,位于logging.handlers模块中,支持在内存中缓冲日志记录,定期将它们刷新到target处理程序。只要缓冲区已满,或者看到某种严重程度或更高的情况,就会发生冲洗.

MemoryHandler是更通用的子类BufferingHandler,这是一个抽象类。这会将记录记录缓冲在内存中。每当将每条记录添加到缓冲区时,都会通过调用shouldFlush()查看缓冲区是否应该刷新。如果它应该,那么flush()应该进行冲洗.

class logging.handlers.BufferingHandler (capacity)
用规定容量的缓冲器对处理器进行初始化.

emitrecord
将记录追加到缓冲区。如果shouldFlush()返回true,则调用flush()来处理缓冲区.
flush ()
您可以覆盖它以实现自定义刷新行为。这个版本只需将缓冲区清空即可.
shouldFlush (record
如果缓冲区达到容量,则返回true。这种方法可以用来实现自定义冲洗策略.
class logging.handlers.MemoryHandler (capacity, flushLevel=ERROR, target=None, flushOnClose=True)
返回MemoryHandler类。该实例初始化为缓冲区大小capacity。如果没有指定flushLevel,则使用ERROR。如果没有指定target,则需要使用setTarget()在此处理程序执行任何有用之前如果flushOnClose被指定为False,则当处理程序关闭时,缓冲区被not刷新。如果没有指定或指定为True,当处理程序关闭时,会发生前一次冲洗缓冲区的行为.

版本3.6更改:flushOnClose参数被添加了

close
打电话flush(),将目标设定为None并清除缓冲区.
flush
为一个 MemoryHandler,刷新意味着只是将bufferedrecords发送到目标,如果有的话。发生这种情况时,缓冲区也会被清除。如果你想要不同的行为,请改写.
setTarget (target )
设置此处理程序的目标处理程序.
shouldFlush(record)
检查缓冲区满或flushLevel或更高的记录.

 

HTTPHandler

HTTPHandler类,位于logging.handlers模块,支持使用GET要么POSTsemantics.

class logging.handlers.HTTPHandlerhost, url, method=”GET”, secure=False, credentials=None, context=None
返回HTTPHandler类。host可以是host:port,您是否需要使用特定的端口号。如果没有method指定,GET使用。如果secure为真,则使用HTTPS连接。context参数可以设置为ssl.SSLContext实例,以配置用于HTTP连接的SSL设置。如果指定了credentials,则它应该是用户ID和密码的2-tupleconsisting,它将使用基本身份验证放置在HTTP’Authorization’标头中。如果你指定了credentials,你还应该指定secure = True,这样你的用户标识和密码就不会通过网络以明文形式传递.

更改版本3.5: context参数添加了

mapLogRecordrecord)
提供一个基于record的字典,它将被URL编码并发送到Web服务器。默认实现只返回record.__dict__。如果例如,可以覆盖该方法。仅将LogRecord的asubset发送到Web服务器,或者需要更具体地定制发送到服务器的内容.
emit (record )
将记录作为URL编码的字典发送到Web服务器。该mapLogRecord()方法用于将记录转换为要发送的字典.

注意

由于准备将其发送到Web服务器的记录与通用格式化操作不同,使用setFormatter()Formatter指定HTTPHandler没有效果。相反打电话format(),这个处理程序调用mapLogRecord()然后urllib.parse.urlencode()以适合发送到Web服务器的形式编码字典.

 

QueueHandler

新版本3.2。

QueueHandler班,位于logging.handlers模块,支持将日志消息发送到队列,例如在queuemultiprocessing modules.

中实现的那些与QueueListener类,QueueHandler可以用来让处理程序在与执行记录的线程不同的线程上完成工作。这在Web应用程序以及其他服务应用程序中非常重要,其中服务客户端的线程需要尽可能快地响应,同时任何可能很慢的操作(例如通过SMTPHandler)是在一个单独的线程上完成的

class logging.handlers.QueueHandlerqueue)
返回QueueHandler类。该实例已使用队列初始化以发送消息。队列可以是任何类似对象;它被enqueue()方法原样使用,需要知道如何向它发送消息.

emitrecord
排队准备LogRecord的结果.
prepare (record)
准备排队记录。这种方法返回的对象入队了

基本实现格式化记录以合并消息,参数和异常信息(如果存在)。它还可以从记录中移除不可拾取的物品.

如果要将记录转换为字典或JSON字符串,或者在保留原始记录的同时发送记录的修改副本,则可能需要覆盖此方法.

enqueue (record
使用put_nowait()将队列中的记录排入队列;如果你想使用阻塞行为,atimeout或自定义队列实现,你可能想要覆盖它.

 

QueueListener

版本3.2.

中的新增QueueListener类,位于logging.handlers模块中,支持从队列中接收日志消息,例如queue中实现的那些消息要么 multiprocessing模块。从内部线程中的队列接收主题,并在同一线程上将其传递给一个或多个处理程序以进行处理。而QueueListener它本身并不是一个处理程序,它在这里有记录,因为它与QueueHandler.

一起随QueueHandler一起使用,QueueListener可以用来让处理程序在与执行记录的线程不同的线程上完成工作。这在Web应用程序以及其他服务应用程序中非常重要,其中服务客户端的线程需要尽可能快地响应,同时任何可能很慢的操作(例如通过SMTPHandler)是在一个单独的线程上完成的

class logging.handlers.QueueListenerqueue, *handlers, respect_handler_level=False)
返回QueueListener类。该实例初始化为队列以向其发送消息以及处理器列表,这些处理程序将处理放置在队列中的条目。队列可以是任何类似队列的对象;它按原样传递给dequeue()方法,该方法需要知道如何从中获取消息。如果respect_handler_levelTrue,则在决定是否将消息传递给该处理程序时,会尊重处理程序的级别(与消息的级别进行比较);否则,行为与以前的Python版本一样 – 总是将每条消息传递给每个处理程序.

更改版本3.5:添加了respect_handler_levels参数.

dequeueblock
将记录出列并将其返回,可选地阻塞

基本实现使用get()。如果你想使用超时或使用自定义队列实现,你可能想要覆盖这个方法.

prepare (record)
准备一份处理记录.

此实现只返回传入的记录。如果您需要对记录执行任何自定义编组或操作,然后再将其传递给处理程序,则可能需要重新使用此方法.

handlerecord
处理记录

这只是通过处理程序循环,为它们提供处理记录。传递给处理程序的实际对象是从prepare().

start
启动监听器.

这启动一个后台线程来监视队列以便日志记录处理.

stop)
停止听众.

这要求线程终止,然后等待它这样做。注意如果你在应用程序退出之前没有调用它,那么队列中可能还会留下一些记录,这些记录将不会被处理.

enqueue_sentinel
将一个标记写入队列,告诉听众退出。这个实现用put_nowait()。如果要使用超时或使用自定义队列实现,可能需要覆盖此方法.

3.3版本中的新功能

也可以看看

模块logging
日志模块的API参考.
模块logging.config
日志模块的配置API。

评论被关闭。