记录处理程序 – 通用操作系统服务(Python教程)(参考资料)
logging.handlers
– 记录处理程序
源代码: Lib / logging / handlers.py
包中提供了以下有用的处理程序。请注意,StreamHandler
, FileHandler
中实际定义了三个处理程序(NullHandler
和logging
模块本身,但这里已经记录了其他处理程序.
StreamHandler
StreamHandler
类,位于核心logging
包中,发送日志输出到sys.stdout, sys.stderr或类似任何文件的对象(或更确切地说,支持write()
和flush()
方法的任何对象).
- class
logging.
StreamHandler
(stream=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"
.
NullHandler
新版本3.1.
NullHandler
班,位于核心logging
包,不做任何格式化或输出。它实际上是图书馆开发人员使用的“无操作”处理程序.
- class
logging.
NullHandler
- 返回
NullHandler
类。emit
(record)- 这个方法什么都不做.
handle
(record)- 这个方法什么都不做.
createLock
()- 这个方法返回
None
对于锁定,因为存在需要序列化访问的nounderlying I / O.
查看配置库的日志有关如何使用的更多信息NullHandler
.
WatchedFileHandler
位于WatchedFileHandler
模块中的logging.handlers
类是FileHandler
,它监视它正在登录的文件。如果文件发生变化,则关闭并使用文件名重新打开.
由于使用newsyslog和logrotate执行日志文件轮换。这个处理程序,打算在Unix / Linux下使用,监视文件以查看自上次发出后它是否已更改。(如果文件的设备或inode已更改,则认为文件已更改。)如果文件已更改,则旧文件流关闭,文件打开以重新获得流量
此处理程序不适合在Windows下使用,因为在Windowsopen日志文件中无法移动或重命名 – 日志记录打开文件具有锁定 – 因此不需要这样的处理程序。此外,ST_INOWindows不支持;stat()
总是返回zerofor这个值.
- class
logging.handlers.
WatchedFileHandler
(filename, 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
模块中,是旋转文件处理程序的基类,RotatingFileHandler
和TimedRotatingFileHandler
。你不应该需要实例化这个类,但它有你可能需要覆盖的属性和方法.
- 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.
存在属性的原因是为了节省你必须的子类 – 你可以对RotatingFileHandler
和TimedRotatingFileHandler
。如果namer或rotator callableraises一个异常,这将在与emit()
打电话,即通过handleError()
处理程序的方法
如果需要对旋转处理进行更重要的更改,可以使用方法.
例如,请参阅使用旋转器和命名器来自定义日志旋转处理.
RotatingFileHandler
RotatingFileHandler
类位于logging.handlers
模块中,支持旋转磁盘日志文件。
- class
logging.handlers.
RotatingFileHandler
(filename, mode=”a”, maxBytes=0, backupCount=0, encoding=None, delay=False) - 返回
RotatingFileHandler
类的新实例。打开指定的文件并将其用作日志记录的流。如果没有指定mode,则使用"a"
。如果encoding不是None
,则用于打开带有该编码的文件。如果delay为真,那么文件打开将推迟到第一次调用emit()
。默认情况下,文件无限增长.您可以使用maxBytes和backupCount值来允许文件以预定大小rollover。当要超过大小时,将关闭文件并静默打开一个新文件以进行输出。只要当前日志文件的长度接近maxBytes,就会发生翻转;但是如果maxBytes或backupCount中的任何一个为零,则不会发生翻转,所以你通常要把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.
TimedRotatingFileHandler
(filename, when=”h”, interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None) - 返回
TimedRotatingFileHandler
类。打开指定的文件并将其用作日志记录流。在旋转时,alsosets是文件名后缀。根据when和interval.的乘积进行旋转你可以使用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
用于与远程机器通信的类,其地址由host和port.给出。在版本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
类的新实例,用于与远程机器进行通信其地址由host和port.在版本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.
SysLogHandler
(address=(“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。如果没有指定facility,LOG_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 crit
或critical
LOG_CRIT debug
LOG_DEBUG emerg
或panic
LOG_EMERG err
或error
LOG_ERR info
LOG_INFO notice
LOG_NOTICE warn
或warning
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
mapPriority
(levelname)- 将日志记录级别名称映射到syslog优先级名称。如果使用自定义级别,或者使用默认算法,则可能需要覆盖此名称不适合您的需求。默认算法将
DEBUG
,INFO
,WARNING
,ERROR
和CRITICAL
映射到等效的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名称。目前的版本不这样做.
emit
(record)- 确定消息ID,事件类别和事件类型,然后在NT事件日志中记录消息.
getEventCategory
(record)- 返回记录的事件类别。如果要指定自己的类别,请覆盖此项。此版本返回0.
getEventType
(record)- 返回记录的事件类型。如果要指定自己的类型,请覆盖此项。这个版本使用handler’stypemap属性进行映射,该属性在
__init__()
到包含DEBUG
,INFO
,WARNING
,ERROR
和CRITICAL
的映射的字典。如果您正在使用自己的级别,则需要覆盖此方法或在处理程序的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) - 用规定容量的缓冲器对处理器进行初始化.
emit
(record)- 将记录追加到缓冲区。如果
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
要么POST
semantics.
- class
logging.handlers.
HTTPHandler
(host, 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参数添加了
mapLogRecord
(record)- 提供一个基于
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
模块,支持将日志消息发送到队列,例如在queue
或multiprocessing
modules.
中实现的那些与QueueListener
类,QueueHandler
可以用来让处理程序在与执行记录的线程不同的线程上完成工作。这在Web应用程序以及其他服务应用程序中非常重要,其中服务客户端的线程需要尽可能快地响应,同时任何可能很慢的操作(例如通过SMTPHandler
)是在一个单独的线程上完成的
- class
logging.handlers.
QueueHandler
(queue) - 返回
QueueHandler
类。该实例已使用队列初始化以发送消息。队列可以是任何类似对象;它被enqueue()
方法原样使用,需要知道如何向它发送消息.emit
(record)- 排队准备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.
QueueListener
(queue, *handlers, respect_handler_level=False) - 返回
QueueListener
类。该实例初始化为队列以向其发送消息以及处理器列表,这些处理程序将处理放置在队列中的条目。队列可以是任何类似队列的对象;它按原样传递给dequeue()
方法,该方法需要知道如何从中获取消息。如果respect_handler_level
是True
,则在决定是否将消息传递给该处理程序时,会尊重处理程序的级别(与消息的级别进行比较);否则,行为与以前的Python版本一样 – 总是将每条消息传递给每个处理程序.更改版本3.5:添加了
respect_handler_levels
参数.dequeue
(block)- 将记录出列并将其返回,可选地阻塞
基本实现使用
get()
。如果你想使用超时或使用自定义队列实现,你可能想要覆盖这个方法.
prepare
(record)- 准备一份处理记录.
此实现只返回传入的记录。如果您需要对记录执行任何自定义编组或操作,然后再将其传递给处理程序,则可能需要重新使用此方法.
handle
(record)- 处理记录
这只是通过处理程序循环,为它们提供处理记录。传递给处理程序的实际对象是从
prepare()
.
start
()- 启动监听器.
这启动一个后台线程来监视队列以便日志记录处理.
stop
()- 停止听众.
这要求线程终止,然后等待它这样做。注意如果你在应用程序退出之前没有调用它,那么队列中可能还会留下一些记录,这些记录将不会被处理.
enqueue_sentinel
()- 将一个标记写入队列,告诉听众退出。这个实现用
put_nowait()
。如果要使用超时或使用自定义队列实现,可能需要覆盖此方法.3.3版本中的新功能
也可以看看
- 模块
logging
- 日志模块的API参考.
- 模块
logging.config
- 日志模块的配置API。
评论被关闭。