16.8. logging.handlers - 记录处理程序

源代码: Lib / logging / handlers.py

模块本身提供以下几个有用的handler。注意事实上,在logging模块本身中定义了三个处理程序(StreamHandlerFileHandlerNullHandler但在这里与其他处理程序一起记录。

16.8.1. StreamHandler

位于核心logging包中的StreamHandler类将记录输出发送到诸如sys.stdoutsys.stderr 或任何类文件对象(或更确切地说,支持write()flush()方法的任何对象)。

class logging.StreamHandler(stream=None)

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

emit(record)

如果指明了formatter,它将用来格式化记录。然后使用终止符将记录写入流。如果存在异常信息,则使用traceback.print_exception()对其进行格式化,并附加到流。

flush()

通过调用其flush()方法刷新流。注意,close()方法继承自Handler,因此没有输出,因此可能需要显式的flush()

在版本3.2中更改: StreamHandler类现在具有terminator属性,默认值'\n'当将格式化的记录写入流时用作终止符。如果不希望此换行符终止,可以将处理程序实例的terminator属性设置为空字符串。在早期版本中,终止符被硬编码为'\n'

16.8.2. FileHandler

位于核心logging包中的FileHandler类将日志记录输出发送到磁盘文件。它继承了StreamHandler的输出功能。

class logging.FileHandler(filename, mode='a', encoding=None, delay=False)

返回FileHandler类的新实例。指明的文件会被打开,并用作日志流。如果未指定mode,则使用'a'如果encoding不为None,会用指定的编码来打开文件。如果delay为真,则文件打开将延迟到第一次调用emit()默认情况下,文件会一直增长。

close()

关闭文件。

emit(record)

将记录输出至文件。

16.8.3. NullHandler

版本3.1中的新功能。

位于核心logging包中的NullHandler类不执行任何格式化或输出。本质上它是个‘什么都不做’的handler,由库开发者使用。

class logging.NullHandler

返回NullHandler类的新实例。

emit(record)

该方法不做任何事。

handle(record)

该方法不做任何事。

createLock()

此方法为锁返回None,因为没有需要对其进行序列化的底层I / O。

有关如何使用NullHandler的详细信息,请参阅Configuring Logging for a Library

16.8.4. WatchedFileHandler

位于logging.handlers模块中的WatchedFileHandler类是一个FileHandler,用于监视其正在记录的文件。如果文件有改变,它关闭然后重新打开文件名。

文件发生变化可以是因为使用了newsysloglogrotate这样的程序,它们用来完成日志文件的循环。该handler主要用于Unix/Linux下,用来观察从上次修改后文件是否有变化。(如果文件的设备或者inode发生了变化,则文件被认为发生了变化。)如果文件发生了变化,关闭老的文件流,打开的文件得到一个新的文件流。

该handler不适用于Windows下,因为在Windows下打开的日志文件不能被移动或者重命名——日志以排外锁的方式打开文件——所以也就不需要这样的handler。此外,在Windows下不支持ST_INOstat()始终为此值返回零。

class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False)

返回WatchedFileHandler类的新实例。指明的文件会被打开,并用作日志流。如果未指定mode,则使用'a'如果encoding不为None,会用指定的编码来打开文件。如果delay为真,则文件打开将延迟到第一次调用emit()默认情况下,文件会一直增长。

emit(record)

将记录输出至文件,但在此之前先检查文件是否有变化。如果文件有变化,在输出记录到文件之前先刷新当前流,然后关闭当前流,然后重新打开文件。

16.8.5. BaseRotatingHandler

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

class logging.handlers.BaseRotatingHandler(filename, mode, encoding=None, delay=False)

参数与FileHandler相同。属性是:

namer

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

注意

翻转期间,命名函数被称为相当多次,因此它应该尽可能简单和快速。对于给定的输入,它也应该每次返回相同的输出,否则翻转行为可能无法正常工作。

版本3.3中的新功能。

rotator

如果此属性设置为可调用,则rotate()方法将委托给此可调用。传递给可调用的参数是传递给rotate()的参数。

版本3.3中的新功能。

rotation_filename(default_name)

在旋转时修改日志文件的文件名。

这是提供,以便可以提供自定义文件名。

默认实现调用处理程序的“namer”属性,如果它是可调用的,则传递默认名称。如果属性不可调用(缺省值为None),则将不更改地返回名称。

参数:default_name - 日志文件的默认名称。

版本3.3中的新功能。

rotate(source, dest)

旋转时,旋转当前日志。

默认实现调用处理程序的“rotator”属性,如果它是可调用的,将source和dest参数传递给它。如果该属性不可调用(默认为None),则源仅重命名为目标。

参数:
  • source - 源文件名。这通常是基本文件名,例如。'test.log'。
  • dest - 目标文件名。这通常是源旋转到什么位置,例如。'test.log.1'。

版本3.3中的新功能。

属性存在的原因是保存您不必子类化 - 您可以对RotatingFileHandlerTimedRotatingFileHandler的实例使用相同的可调用项。如果命名或旋转器可调用引发异常,则在emit()调用期间,将以与任何其它异常相同的方式处理异常。通过处理程序的handleError()方法。

如果需要对旋转处理进行更重要的更改,则可以覆盖方法。

有关示例,请参阅Using a rotator and namer to customize log rotation processing

16.8.6. RotatingFileHandler

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

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)

返回RotatingFileHandler类的新实例。指明的文件会被打开,并用作日志流。如果未指定mode,则使用'a'如果encoding不为None,会用指定的编码来打开文件。如果delay为真,则文件打开将延迟到第一次调用emit()默认情况下,文件会一直增长。

可以使用maxBytesbackupCount 来让文件在预定义的尺寸发生翻转当文件大小大概要超出时,文件被关闭,新文件被打开用来输出。当当前日志文件的长度接近maxBytes时,发生翻转;如果maxBytesbackupCount为零,则不会发生滚动。如果backupCount不为0,系统将保存老的日志文件,在文件名后加上‘.1’, ‘.2’这样的扩展名。例如,如果backupCount为5,基本文件名为app.log,则会获得app.logapp.log.1app.log.2,最多为app.log.5正在写入的文件始终为app.log当此文件填充时,它将关闭并重命名为app.log.1,如果文件app.log.1app.log.2存在,则将它们重命名为app.log.2app.log.3等。分别。

doRollover()

如上所述做文件的翻转。

emit(record)

输出记录到文件,负责文件的翻转。

16.8.7. TimedRotatingFileHandler

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

class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)

返回TimedRotatingFileHandler类的新实例。指明的文件会被打开,并用作日志流。在循环时它也会设置文件后缀。循环发生基于wheninterval的乘积。

使用when来指明interval的类型。可能的值列在下面。注意大小写不敏感。

间隔类型
'S'
'M'分钟
'H'小时
'D'
'W0'-'W6'平日(0 =星期一)
'midnight'午夜翻滚

注意在使用基于工作日的循环时,‘W0’表示星期一,‘W1’表示星期二,依此类推,‘W6’表示星期日。这种情况下不使用interval

系统会保存老的日志文件,在文件名后添加扩展名。根据滚动间隔,扩展使用strftime格式%Y-%m-%d_%H-%M-%S或其前导部分,基于日期和时间。

第一次计算下一次翻转时间的时候(创建handler时),要么使用已存文件的上一次修改时间,要么使用当前时间。

如果utc参数为真,将使用UTC中的时间;否则使用本地时间。

如果backupCount不为0,最多保留backupCount个文件,如果产生更多的文件,最老的文件会被删除。删除逻辑使用间隔来决定删除哪些文件,所以改变间隔可能会导致老的文件被保留。

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

如果atTime不是None,则必须是datetime.time实例,其指定发生翻转的时间,被设置为在“午夜”或“在特定的工作日”。

在版本3.4中更改: atTime参数已添加。

doRollover()

如上所述做文件的翻转。

emit(record)

输出记录到文件,负责文件的翻转。

16.8.8. SocketHandler

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

class logging.handlers.SocketHandler(host, port)

返回用于与远程计算机通信的SocketHandler类的新实例,该远程计算机的地址由主机端口给出。

在版本3.4中更改:如果port被指定为None,则使用host

close()

关闭套接字。

emit()

序列化记录的属性字典,以二进制格式写入套接字。如果套接字发生错误,静默丢弃包。如果连接断开,重建连接。要将接收端的记录解开为LogRecord,请使用makeLogRecord()函数。

handleError()

处理在emit()期间发生的错误。极有可能时连接断开。关闭套接字这样可以在下个事件时重试。

makeSocket()

工厂方法,允许子类定义其希望的套接字类型。默认实现创建一个TCP套接字(socket.SOCK_STREAM)。

makePickle(record)

以二进制格式序列化记录的属性字典,带上长度前缀,返回值可以用于套接字传输。

注意序列化并不完全。如果关心安全,可以重写该方法以实现一个更安全的机制。例如,可以使用HMAC来签名序列化结果,并在接受端验证签名;或者可以在接受端禁止全局对象的反序列化。

send(packet)

将序列化的串packet发往套接字。该函数使得网络繁忙时可以发送部分包。

createSocket()

尝试创建套接字; on失败,使用指数退避算法。在初始失败时,处理程序将删除它试图发送的消息。当接下来的消息由同一个的实例来处理时,不会马上尝试重连,而是先等一段时间。初始延迟的默认值是1秒,如果还是不能重连,加倍延迟时间,只到最大值30秒为止。

该行为由下列handler属性来控制:

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

这意味着如果在使用handler之后才启动远端监听者,有可能会丢失消息(因为handler不会在延迟之前尝试重连,而在这段时期会丢弃消息)。

16.8.9. DatagramHandler

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

class logging.handlers.DatagramHandler(host, port)

返回用于与远程计算机通信的DatagramHandler类的新实例,该远程计算机的地址由host端口给出。

在版本3.4中更改:如果port被指定为None,则使用host

emit()

序列化记录的属性字典,以二进制格式写入套接字。如果套接字发生错误,静默丢弃包。要将接收端的记录解开为LogRecord,请使用makeLogRecord()函数。

makeSocket()

SocketHandler的工厂方法在此处被覆盖以创建UDP套接字(socket.SOCK_DGRAM)。

send(s)

向套接字发送序列化过的串。

16.8.10. SysLogHandler

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

class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)

返回用于与远程Unix机器通信的SysLogHandler类的新实例,该远程Unix机器的地址由地址(主机, port)元组。如果未指定地址,则使用('localhost', 514) 地址用于打开套接字。提供(主机, 端口)元组的替代方法是以字符串形式提供地址,例如'/ dev / log'。在这种情况下,使用Unix domain socket来将消息发送给syslog。如果未指定facility,则使用LOG_USER打开的套接字类型取决于socktype参数,默认为socket.SOCK_DGRAM,因此打开一个UDP套接字。要打开TCP套接字(用于较新的syslog守护进程(如rsyslog)),请指定值socket.SOCK_STREAM

请注意,如果您的服务器未在UDP端口514上侦听,则SysLogHandler可能无法正常工作。这种情况下,检查应该使用的domain socket的地址,它依赖于系统。例如,在Linux上一般是‘/dev/log’,在OS/X则是‘/var/run/syslog’。所以检查平台,使用合适的地址(如果应用需要跨平台,则要在运行时检查)。在Windows上不得不使用UDP选项。

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

close()

关闭到远端主机的套接字。

emit(record)

记录被格式化,然后发往syslog服务器。如果有异常信息,发往服务器。

在3.2.1版本中已更改:(请参阅:问题12168。)在早期版本中,发送到syslog守护进程的消息总是以NUL字节终止,因为这些守护进程的早期版本期望NUL终止的消息 - 即使它不在相关规范(RFC 5424)中。这些守护进程的更新版本不期望NUL字节,但如果它在那里,它会剥离它,甚至更多的最近的守护进程(更紧密地遵守RFC 5424)通过NUL字节作为消息的一部分。

为了在面对所有这些不同的守护进程行为时使得能够更容易地处理syslog消息,通过使用类级属性append_nul来使NUL字节的追加可配置。这默认为True(保留现有行为),但可以在SysLogHandler实例中设置为False,以使该实例为不是追加NUL终结符。

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

encodePriority(facility, priority)

将设备和优先权编码为整数。可以传字符串或者整数——如果传了字符串,使用内部的映射字典来将其转成整数。

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

优先权

名称(字符串)符号值
alertLOG_ALERT
critcriticalLOG_CRIT
debugLOG_DEBUG
emergpanicLOG_EMERG
errerrorLOG_ERR
infoLOG_INFO
noticeLOG_NOTICE
warnwarningLOG_WARNING

设备

名称(字符串)符号值
authLOG_AUTH
authprivLOG_AUTHPRIV
cronLOG_CRON
daemonLOG_DAEMON
ftpLOG_FTP
kernLOG_KERN
lprLOG_LPR
mailLOG_MAIL
newsLOG_NEWS
syslogLOG_SYSLOG
userLOG_USER
uucpLOG_UUCP
local0LOG_LOCAL0
local1LOG_LOCAL1
local2LOG_LOCAL2
local3LOG_LOCAL3
local4LOG_LOCAL4
local5LOG_LOCAL5
local6LOG_LOCAL6
local7LOG_LOCAL7
mapPriority(levelname)

将日志级别名映射成syslog优先权名字。重写该函数,如果使用了自定义级别,或者如果默认的算法不符合需求。默认算法将DEBUGINFOWARNINGERRORCRITICAL映射到等效的syslog名称,所有其他级别名称为“warning”。

16.8.11. NTEventLogHandler

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

class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')

返回NTEventLogHandler类的新实例。appname定义出现在事件日志中的应用的名字。使用此名创建对应的注册表记录。dllname应该提供.dll或.exe的完全限定路径名,其中包含要在日志中保存的消息定义(如果未指定,则使用'win32service.pyd'注意使用占位符使得事件日志变大,整个消息源都包含在日志中。如果希望减小日志,需要传入自定义的.dll 或者 .exe的名字,其中包含了希望使用的消息定义)。logtype'Application''System''Security'之一,默认为'Application'

close()

调用之后,就可以从注册表中将应用的名字删除(它作为事件日志的源头)。但是如果这样做了,就不能像想象的那样,在事件日志查看器中看到事件——因为它需要从注册表中来得到.dll的名字。当前的版本不这样做。

emit(record)

决定消息ID,事件分类和类型,将消息记录到NT事件日志中。

getEventCategory(record)

返回记录的事件分类。如果需要指定自己的分类,重写该函数。该版本返回0。

getEventType(record)

返回记录的事件类型。如果需要指定自己的类型,重写该函数。此版本使用处理程序的typemap属性进行映射,该属性在__init__()中设置为包含映射到DEBUGINFOWARNINGERRORCRITICAL如果使用了自定义级别,即可以重写该方法,也可以给handler的typemap属性合适的字典。

getMessageID(record)

返回记录的消息ID。如果使用自定义消息,可以给logger的msg传个ID而不是格式化字符串。然后可以使用字典查询来得到消息ID。此版本返回1,这是win32service.pyd中的基本消息ID。

16.8.12. SMTPHandler

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

class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)

返回SMTPHandler类的新实例。实例由发信人/收信人地址及邮件的主题初始化得来。toaddrs是字符串的列表。要指明非标准SMTP端口,给mailhost参数一个(host, port)形式的元组。如果使用字符串,使用标准的SMTP端口。如果SMTP服务器需要验证,给credentials参数一个(username, password)元组。

要指明使用安全协议(TLS),给secure参数传个元组。这只有在验证凭证提供的情况下才使用。元组可以是空元组,或者单一值的元组,值为密钥文件的名字,或者是2值元组,值为密钥文件和证书文件的名字。(此元组传递到smtplib.SMTP.starttls()方法。)

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

版本3.3中的新功能:添加了超时参数。

emit(record)

格式化记录并将其发往指定的地址。

getSubject(record)

如果需要根据记录来指定主题,重写该方法。

16.8.13. MemoryHandler

MemoryHandler类位于logging.handlers模块中,支持在内存中缓存日志记录,定期将它们刷新为目标处理程序。当缓冲满了会刷新,或者发现特定级别及其以上的事件也会刷新。

MemoryHandler是更通用的BufferingHandler的子类,它是一个抽象类。它在内存中缓冲日志记录。每当每个记录被添加到缓冲区时,通过调用shouldFlush()来检查缓冲区是否应该被刷新。如果应该,则flush()预期进行刷新。

class logging.handlers.BufferingHandler(capacity)

初始化handler,建立指定capacity的缓冲。

emit(record)

向缓冲中添加记录。如果shouldFlush()返回true,调用flush()来处理缓冲区。

flush()

重写该方法来实现自定义的刷新行为。该版本只是清空缓冲。

shouldFlush(record)

如果缓冲达到容量上限则返回真。可以重写该方法以实现自定义的刷新策略。

class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None)

返回MemoryHandler类的新实例。实例初始化大小为capacity的缓冲。如果未指定flushLevel,则使用ERROR如果未指定target,则在此处理程序执行任何有用操作之前,需要使用setTarget()设置目标。

close()

调用flush(),将目标设置为None并清除缓冲区。

flush()

对于MemoryHandler,刷新意味着仅将缓冲的记录发送到目标(如果有的话)。当该情况发生时缓冲也被清空。如果希望不同的行为,重写该方法。

setTarget(target)

为该handler设置目标handler。

shouldFlush(record)

检查缓冲是否满了,或者记录是否是flushLevel级别或者更高。

16.8.14. HTTPHandler

位于logging.handlers模块中的HTTPHandler类支持使用GETPOST语义。

class logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None, context=None)

返回HTTPHandler类的新实例。如果您需要使用特定的端口号,则主机可以是host:port的形式。如果未指定方法,则使用GET如果secure为true,将使用HTTPS连接。可以将上下文参数设置为ssl.SSLContext实例,以配置用于HTTPS连接的SSL设置。如果指定凭证,则它应该是由用户标识和密码组成的2元组,将使用基本认证放置在HTTP“授权”标题中。如果指定凭据,则还应指定secure = True,以便不会通过线路以明文形式传递您的用户标识和密码。

在版本3.5中已更改: t>>添加了上下文参数。

mapLogRecord(record)

提供基于record的字典,该字典将进行URL编码并发送到Web服务器。默认实现只返回record.__dict__该方法可以被覆盖,例如只有LogRecord的子集要发送到Web服务器,或者需要更多特定的定制发送到服务器的内容。

emit(record)

将记录作为URL编码字典发送到Web服务器。mapLogRecord()方法用于将记录转换为要发送的字典。

注意

Since preparing a record for sending it to a Web server is not the same as a generic formatting operation, using setFormatter() to specify a Formatter for a HTTPHandler has no effect. 这个处理程序不是调用format(),而是调用mapLogRecord()然后urllib.parse.urlencode()适合发送到Web服务器。

16.8.15. QueueHandler

版本3.2中的新功能。

The QueueHandler class, located in the logging.handlers module, supports sending logging messages to a queue, such as those implemented in the queue or multiprocessing modules.

QueueListener类一起,QueueHandler可用于让处理程序在与执行日志记录的线程不同的线程上执行其工作。这在Web应用程序和其他服务应用程序中很重要,其中服务客户端的线程需要尽可能快地响应,而任何潜在的缓慢操作(例如通过SMTPHandler发送电子邮件)都是在单独的线程。

class logging.handlers.QueueHandler(queue)

返回QueueHandler类的新实例。实例用发送消息的队列初始化。队列可以是任何类似队列的对象;它按原样使用enqueue()方法,该方法需要知道如何向其发送消息。

emit(record)

使准备LogRecord的结果入队。

prepare(record)

准备一个记录以排队。此方法返回的对象已排入队列。

基本实现格式化记录以合并消息和参数,并且从记录中原地移除不可取消项。

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

enqueue(record)

使用put_nowait()将队列中的记录排队;如果要使用阻塞行为,超时或自定义队列实现,您可能想要覆盖此选项。

16.8.16. QueueListener

版本3.2中的新功能。

The QueueListener class, located in the logging.handlers module, supports receiving logging messages from a queue, such as those implemented in the queue or multiprocessing modules. 消息从内部线程中的队列中接收并在同一线程上传递到一个或多个处理程序进行处理。虽然QueueListener本身不是处理程序,但在此处记录,因为它与QueueHandler紧密相关。

QueueHandler类一起,QueueListener可用于让处理程序在与执行日志记录的线程不同的线程上执行其工作。这在Web应用程序和其他服务应用程序中很重要,其中服务客户端的线程需要尽可能快地响应,而任何潜在的缓慢操作(例如通过SMTPHandler发送电子邮件)都是在单独的线程。

class logging.handlers.QueueListener(queue, *handlers, respect_handler_level=False)

返回QueueListener类的新实例。实例使用发送消息的队列和处理器列表初始化,处理器将处理放置在队列上的条目。队列可以是任何类似队列的对象;它按原样传递到dequeue()方法,该方法需要知道如何从中获取消息。如果respect_handler_levelTrue,当决定是否向该处理程序传递消息时,处理程序的级别被遵守(与消息的级别相比)否则,该行为与以前的Python版本一样 - 总是将每个消息传递给每个处理程序。

在版本3.5中已更改:添加了respect_handler_levels参数。

dequeue(block)

出队记录并返回它,可选择阻塞。

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

prepare(record)

准备处理记录。

这个实现只返回传入的记录。如果您需要在将记录传递给处理程序之前对记录进行任何自定义编组或操作,您可能想要覆盖此方法。

handle(record)

处理记录。

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

start()

启动侦听器。

这将启动一个后台线程来监视队列以使LogRecords处理。

stop()

停止侦听器。

这要求线程终止,然后等待它这样做。请注意,如果您在应用程序退出之前未调用此方法,队列中可能仍会有一些记录,这些记录不会被处理。

enqueue_sentinel()

将哨兵写入队列以告诉侦听器退出。此实现使用put_nowait()如果要使用超时或使用自定义队列实现,您可能想要覆盖此方法。

版本3.3中的新功能。

参见

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