logging.handlers ---日志处理程序

源代码: Lib/logging/handlers.py


包中提供了以下有用的处理程序。注意三个处理程序 (StreamHandlerFileHandlerNullHandler )实际上是在 logging 模块本身,但已在这里与其他处理程序一起记录。

StreamHandler

这个 StreamHandler 类,位于核心 logging 包,将日志记录输出发送到流,例如 sys.stdoutsys.stderr 或者任何类似文件的对象(或者更准确地说,任何支持 write()flush() 方法)。

class logging.StreamHandler(stream=None)

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

emit(record)

如果指定了格式化程序,它将用于格式化记录。然后将记录写入流,然后 terminator .如果存在异常信息,则使用 traceback.print_exception() 并附在小溪上。

flush()

通过调用其 flush() 方法。请注意 close() 方法继承自 Handler 没有输出,所以显式 flush() 有时可能需要调用。

setStream(stream)

将实例的流设置为指定的值(如果不同)。在设置新流之前刷新旧流。

参数

stream -- 处理程序应使用的流。

返回

旧流,如果更改了该流,或 None 如果不是的话。

3.7 新版功能.

terminator

将格式化记录写入流时用作终止符的字符串。默认值为 '\n' .

如果不希望换行终止,可以设置处理程序实例的 terminator 属性设置为空字符串。

在早期版本中,终结者被硬编码为 '\n' .

3.2 新版功能.

FileHandler

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

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

返回的新实例 FileHandler 班级。指定的文件已打开并用作日志记录流。如果 mode 未指定, 'a' 使用。如果 编码 不是 None ,用于打开使用该编码的文件。如果 延迟 为true,则文件打开延迟到第一次调用 emit() . 默认情况下,文件无限增长。如果 错误 它用于确定如何处理编码错误。

在 3.6 版更改: 以及字符串值, Path 对象也可用于 filename 参数。

在 3.9 版更改: 这个 错误 已添加参数。

close()

关闭文件。

emit(record)

将记录输出到文件。

NullHandler

3.1 新版功能.

这个 NullHandler 类,位于核心 logging 包,不进行任何格式化或输出。它本质上是一个“no-op”处理程序,供库开发人员使用。

class logging.NullHandler

返回的新实例 NullHandler 类。

emit(record)

这个方法什么也不做。

handle(record)

这个方法什么也不做。

createLock()

此方法返回 None 对于锁,因为没有需要序列化访问的基础I/O。

为库配置日志记录 有关如何使用的详细信息 NullHandler .

WatchedFileHandler

这个 WatchedFileHandler 类,位于 logging.handlers 模块,是 FileHandler 它监视正在登录的文件。如果文件发生更改,将关闭该文件并使用文件名重新打开。

由于使用诸如 新日志轮替 执行日志文件旋转。此处理程序用于在UNIX/Linux下使用,它监视文件以查看自上次发出后是否发生了更改。(如果文件的设备或inode已更改,则认为该文件已更改。)如果文件已更改,则关闭旧的文件流,并打开该文件以获取新的流。

此处理程序不适合在Windows下使用,因为在Windows下,无法移动或重命名打开日志文件-日志使用独占锁打开文件-因此不需要这样的处理程序。此外, ST_INO 在Windows下不受支持; stat() 此值始终返回零。

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

返回的新实例 WatchedFileHandler 班级。指定的文件已打开并用作日志记录流。如果 mode 未指定, 'a' 使用。如果 编码 不是 None ,用于打开使用该编码的文件。如果 延迟 为true,则文件打开延迟到第一次调用 emit() . 默认情况下,文件无限增长。如果 错误 它确定如何处理编码错误。

在 3.6 版更改: 以及字符串值, Path 对象也可用于 filename 参数。

在 3.9 版更改: 这个 错误 已添加参数。

reopenIfNeeded()

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

3.6 新版功能.

emit(record)

将记录输出到文件,但首先调用 reopenIfNeeded() 如果文件已更改,则重新打开。

BaseRotatingHandler

这个 BaseRotatingHandler 类,位于 logging.handlers module,是旋转文件处理程序的基类, RotatingFileHandlerTimedRotatingFileHandler . 您不需要实例化这个类,但它有您可能需要重写的属性和方法。

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

参数如下 FileHandler . 这些属性包括:

namer

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

注解

在滚动期间,NAMER函数被多次调用,因此它应该尽可能简单和快速。对于给定的输入,它还应该每次返回相同的输出,否则滚动行为可能无法按预期工作。

3.3 新版功能.

rotator

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

3.3 新版功能.

rotation_filename(default_name)

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

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

默认实现调用处理程序的“namer”属性(如果它是可调用的),并将默认名称传递给它。如果属性不可调用(默认为 None )返回的名称不变。

参数

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

3.3 新版功能.

rotate(source, dest)

旋转时,旋转当前日志。

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

参数
  • source -- 源文件名。这通常是基本文件名,例如“test.log”。

  • dest -- 目标文件名。这通常是源的旋转方向,例如“test.log.1”。

3.3 新版功能.

属性存在的原因是为了保存您必须子类的内容-您可以对 RotatingFileHandlerTimedRotatingFileHandler . 如果NAMER或ROTATOR可调用引发异常,则在 emit() 调用,即通过 handleError() 处理程序的方法。

如果需要对旋转处理进行更重要的更改,可以重写这些方法。

例如,请参见 使用Rotator和Namer自定义日志旋转处理 .

RotatingFileHandler

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

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

返回的新实例 RotatingFileHandler 班级。指定的文件已打开并用作日志记录流。如果 mode 未指定, 'a' 使用。如果 编码 不是 None ,用于打开使用该编码的文件。如果 延迟 为true,则文件打开延迟到第一次调用 emit() . 默认情况下,文件无限增长。如果 错误 它确定如何处理编码错误。

你可以使用 最大字节备份计数 允许文件 rollover 以预定的尺寸。当大小即将超过时,文件将关闭,新文件将自动打开以供输出。每当当前日志文件接近 最大字节 长度;但如果 最大字节备份计数 为零,不会发生滚动,因此通常要设置 备份计数 至少为1,并且具有非零 最大字节 . 什么时候? 备份计数 为非零,系统将通过在文件名后附加扩展名“.1”、“.2”等来保存旧日志文件。例如,使用 备份计数 共5个,基本文件名为 app.log 你会得到 app.logapp.log.1app.log.2app.log.5 . 正在写入的文件总是 app.log . 当此文件被填充时,它将被关闭并重命名为 app.log.1 如果文件 app.log.1app.log.2 等存在,然后将其重命名为 app.log.2app.log.3 等。

在 3.6 版更改: 以及字符串值, Path 对象也可用于 filename 参数。

在 3.9 版更改: 这个 错误 已添加参数。

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, errors=None)

返回的新实例 TimedRotatingFileHandler 类。指定的文件已打开并用作日志记录流。旋转时,它还设置文件名后缀。旋转是根据 when间隔 .

你可以使用 when 指定 间隔 . 可能值列表如下。请注意,它们不区分大小写。

价值

间隔类型

如果/如何 atTime 使用

'S'

忽略

'M'

分钟

忽略

'H'

小时

忽略

'D'

忽略

'W0'-'W6'

工作日(0=星期一)

用于计算初始滚动时间

'midnight'

午夜翻车,如果 atTime 未指定,否则 atTime

用于计算初始滚动时间

当使用基于工作日的轮换时,请为星期一指定“w0”,为星期二指定“w1”,等等,最多为星期日指定“w6”。在这种情况下,传递给 间隔 没有被使用。

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

当第一次计算下一个滚动时间(创建处理程序时),现有日志文件的最后修改时间,或者当前时间,用于计算下一个旋转何时发生。

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

如果 备份计数 最多为非零 备份计数 将保留文件,如果在发生滚动时创建更多文件,则会删除最旧的文件。删除逻辑使用间隔来确定要删除哪些文件,因此更改间隔可能会使旧文件处于空闲状态。

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

如果 atTime 不是 None ,必须是 datetime.time 实例,该实例指定发生滚动的时间,用于将滚动设置为“午夜”或“特定工作日”发生的情况。注意,在这些情况下, atTime 有效地使用值来计算 initial 翻车和随后的翻车将通过正常间隔计算进行计算。

如果 错误 它用于确定如何处理编码错误。

注解

初始化处理程序时,将完成初始滚动时间的计算。只有在发生滚动时才计算后续滚动时间,只有在发出输出时才会发生滚动。如果不记住这一点,可能会导致一些混乱。例如,如果设置了“每分钟”间隔,这并不意味着您将始终看到以分钟分隔时间(在文件名中)的日志文件;如果在应用程序执行期间,日志输出的生成频率超过了每分钟一次, then 您可以看到时间间隔为一分钟的日志文件。另一方面,如果日志记录消息每五分钟只输出一次(比如说),那么文件时间中会有与没有输出(因此不会发生滚动)的分钟相对应的间隙。

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

在 3.6 版更改: 以及字符串值, Path 对象也可用于 filename 参数。

在 3.9 版更改: 这个 错误 已添加参数。

doRollover()

进行翻滚,如上所述。

emit(record)

将记录输出到文件,以满足如上所述的滚动。

SocketHandler

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

class logging.handlers.SocketHandler(host, port)

返回的新实例 SocketHandler 用于与远程计算机通信的类,该远程计算机的地址由 hostport .

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

close()

关闭Socket。

emit()

pickle记录的属性字典并以二进制格式将其写入套接字。如果套接字有错误,请静默地丢弃数据包。如果连接以前丢失,请重新建立连接。将接收端的记录解锁为 LogRecord 使用 makeLogRecord() 功能。

handleError()

处理在 emit() . 最可能的原因是连接中断。关闭套接字以便我们可以在下一个事件上重试。

makeSocket()

这是一个工厂方法,它允许子类定义他们想要的套接字的精确类型。默认实现创建TCP套接字 (socket.SOCK_STREAM

makePickle(record)

使用长度前缀以二进制格式pickle记录的属性字典,并返回该字典,以便在套接字之间传输。此操作的详细信息相当于:

data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data

注意泡菜并不是完全安全的。如果您关心安全性,您可能希望重写此方法以实现更安全的机制。例如,可以使用hmac对pickles进行签名,然后在接收端对其进行验证,或者也可以禁用接收端全局对象的取消拾取。

send(packet)

发送一个腌制的字节字符串 小包裹 到插座。发送字节字符串的格式如以下文档中所述: makePickle() .

此功能允许部分发送,当网络繁忙时可能发生这种情况。

createSocket()

尝试创建套接字;失败时,使用指数后退算法。在初始失败时,处理程序将删除它试图发送的消息。当随后的消息由同一个实例处理时,在经过一段时间之后,它才会尝试连接。默认参数是这样的:初始延迟为一秒钟,如果在该延迟之后仍然无法建立连接,则处理程序将每次将延迟加倍,最多30秒。

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

  • retryStart (初始延迟,默认为1.0秒)。

  • retryFactor (乘数,默认为2.0)。

  • retryMax (最大延迟,默认为30.0秒)。

这意味着如果远程侦听器启动 之后 处理程序已被使用,您可能会丢失消息(因为处理程序在延迟结束之前甚至不会尝试连接,而只是在延迟期间悄悄地删除消息)。

DatagramHandler

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

class logging.handlers.DatagramHandler(host, port)

返回的新实例 DatagramHandler 用于与远程计算机通信的类,该远程计算机的地址由 hostport .

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

emit()

pickle记录的属性字典并以二进制格式将其写入套接字。如果套接字有错误,请静默地丢弃数据包。将接收端的记录解锁为 LogRecord 使用 makeLogRecord() 功能。

makeSocket()

工厂方法 SocketHandler 此处是否重写以创建UDP套接字 (socket.SOCK_DGRAM

send(s)

将已腌制的字节字符串发送到套接字。发送字节字符串的格式如以下文档中所述: SocketHandler.makePickle() .

SysLogHandler

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

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

返回的新实例 SysLogHandler 用于与远程UNIX计算机通信的类,该计算机的地址由 地址 以A的形式 (host, port) 元组。如果 地址 未指定, ('localhost', 514) 使用。地址用于打开套接字。除了提供 (host, port) tuple以字符串形式提供地址,例如'/dev/log'。在这种情况下,使用UNIX域套接字将消息发送到系统日志。如果 设施 未指定, LOG_USER 使用。打开的Socket类型取决于 SOCKT型 参数,默认为 socket.SOCK_DGRAM 从而打开一个UDP套接字。要打开TCP套接字(用于更新的syslog守护进程,如rsyslog),请指定值 socket.SOCK_STREAM .

请注意,如果您的服务器没有监听UDP端口514, SysLogHandler 可能看起来不起作用。在这种情况下,检查您应该为域套接字使用什么地址——它依赖于系统。例如,在Linux上通常是“/dev/log”,但在OS/X上是“/var/run/syslog”。您需要检查您的平台并使用适当的地址(如果您的应用程序需要在多个平台上运行,则可能需要在运行时执行此检查)。在Windows上,您几乎必须使用udp选项。

在 3.2 版更改: SOCKT型 加入。

close()

关闭远程主机的套接字。

emit(record)

记录被格式化,然后发送到系统日志服务器。如果存在异常信息,则为 not 发送到服务器。

在 3.2.1 版更改: (见: bpo-12168 在早期版本中,发送到syslog守护进程的消息总是以nul字节终止,因为这些守护进程的早期版本期望得到一个nul终止的消息,即使它不在相关规范中。 (RFC 5424 )这些守护进程的最新版本不期望nul字节,但如果存在,就将其去掉,甚至更新的守护进程(更接近于RFC5424)将nul字节作为消息的一部分传递给它。

为了在面对所有这些不同的守护进程行为时更容易地处理系统日志消息,通过使用类级属性,nul字节的附加是可配置的, append_nul . 默认为 True (保留现有行为)但可以设置为 False 在一 SysLogHandler 实例,以便该实例 not 附加nul终止符。

在 3.3 版更改: (见: bpo-12419 在早期版本中,没有“ident”或“tag”前缀用于标识消息源的功能。现在可以使用class-level属性指定,默认为 "" 保留现有行为,但可以在 SysLogHandler 实例,以便该实例为处理的每个消息预先设置标识。请注意,所提供的标识必须是文本,而不是字节,并且必须完全按照原样预先添加到消息中。

encodePriority(facility, priority)

将设备和优先级编码为整数。可以传入字符串或整数-如果传递字符串,则使用内部映射字典将其转换为整数。

象征性的 LOG_ 值定义在 SysLogHandler 并镜像 sys/syslog.h 头文件。

Priorities

名称(字符串)

象征价值

alert

LOG_ALERT

crit or critical

LOG_CRIT

debug

LOG_DEBUG

emerg or panic

LOG_EMERG

err or error

LOG_ERR

info

LOG_INFO

notice

LOG_NOTICE

warn or warning

LOG_WARNING

Facilities

名称(字符串)

象征价值

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)

将日志级别名称映射到系统日志优先级名称。如果您正在使用自定义级别,或者默认算法不适合您的需要,则可能需要覆盖此项。默认算法映射 DEBUGINFOWARNINGERRORCRITICAL 到等效的系统日志名称,所有其他级别名称到“警告”。

NTEventLogHandler

这个 NTEventLogHandler 类,位于 logging.handlers 模块,支持将日志信息发送到本地Windows NT、Windows 2000或Windows XP事件日志。在使用它之前,您需要安装MarkHammond的用于Python的win32扩展。

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

返回的新实例 NTEventLogHandler 类。这个 附加名 用于定义出现在事件日志中的应用程序名称。使用此名称创建适当的注册表项。这个 dllname名称 应提供包含要保存在日志中的消息定义的.dll或.exe的完全限定路径名(如果未指定, 'win32service.pyd' 使用-它与Win32扩展一起安装,并包含一些基本的占位符消息定义。请注意,使用这些占位符将使事件日志变大,因为整个消息源都保存在日志中。如果您想要精简日志,您必须以自己的.dll或.exe的名称传递,该名称包含要在事件日志中使用的消息定义)。这个 LogType 是其中之一 'Application''System''Security' ,默认为 'Application' .

close()

此时,您可以从注册表中删除应用程序名作为事件日志项的源。但是,如果这样做,您将无法在事件日志查看器中看到预期的事件-它需要能够访问注册表以获取.dll名称。当前版本不执行此操作。

emit(record)

确定消息ID、事件类别和事件类型,然后将消息记录在NT事件日志中。

getEventCategory(record)

返回记录的事件类别。如果要指定自己的类别,请覆盖此选项。此版本返回0。

getEventType(record)

返回记录的事件类型。如果要指定自己的类型,请重写此项。此版本使用处理程序的typemap属性进行映射,该属性在 __init__() 到包含映射的字典 DEBUGINFOWARNINGERRORCRITICAL . 如果您使用自己的级别,则需要重写此方法或在处理程序的 类型映射 属性。

getMessageID(record)

返回记录的消息ID。如果您使用自己的消息,您可以通过 msg 传递给记录器的是ID而不是格式字符串。然后,在这里,您可以使用字典查找来获取消息ID。此版本返回1,它是中的基本消息ID。 win32service.pyd .

SMTPHandler

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

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

返回的新实例 SMTPHandler 类。实例初始化为电子邮件的“发件人”和“收件人”地址以及“主题”行。这个 托德斯 应该是字符串列表。要指定非标准的SMTP端口,请使用(主机、端口)元组格式 邮件主机 参数。如果使用字符串,则使用标准的SMTP端口。如果您的SMTP服务器需要身份验证,您可以为 资格证书 参数。

要指定安全协议(TLS)的使用,请将元组传递给 保护 参数。仅当提供身份验证凭据时才使用此选项。元组应该是空的元组,或者是具有关键文件名的单值元组,或者是具有关键文件名和证书文件名的2值元组。(此元组传递给 smtplib.SMTP.starttls() 方法。)

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

3.3 新版功能: 这个 timeout 已添加参数。

emit(record)

格式化记录并将其发送给指定的收件人。

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 班级。实例初始化时缓冲区大小为 容量 (缓冲的记录数)。如果 冲洗液位 未指定, ERROR 使用。如果没有 目标 如果指定,则需要使用 setTarget() 在此处理程序执行任何有用的操作之前。如果 弗洛森霍夫 指定为 False ,那么缓冲区是 not 处理程序关闭时刷新。如果未指定或指定为 True ,处理程序关闭时将发生刷新缓冲区的先前行为。

在 3.6 版更改: 这个 弗洛森霍夫 已添加参数。

close()

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

flush()

对于一个 MemoryHandler ,刷新意味着只将缓冲记录发送到目标(如果有)。发生这种情况时,缓冲区也会被清除。如果需要不同的行为,请重写。

setTarget(target)

设置此处理程序的目标处理程序。

shouldFlush(record)

检查缓冲区是否已满或在 冲洗液位 或更高。

HTTPHandler

这个 HTTPHandler 类,位于 logging.handlers 模块,支持向Web服务器发送日志消息,使用 GETPOST 语义学。

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

返回的新实例 HTTPHandler 类。这个 host 可以是这样的形式 host:port ,如果需要使用特定的端口号。如果没有 方法 已指定, GET 使用。如果 保护 为真,将使用HTTPS连接。这个 context 参数可以设置为 ssl.SSLContext 实例来配置用于HTTPS连接的SSL设置。如果 资格证书 如果指定了,它应该是由用户ID和密码组成的2元组,使用基本身份验证将其放置在HTTP“authorization”头中。如果指定凭据,还应指定secure=true,这样用户ID和密码就不会以明文形式通过线路传递。

在 3.5 版更改: 这个 context 已添加参数。

mapLogRecord(record)

提供字典,基于 record ,它将被URL编码并发送到Web服务器。默认实现只返回 record.__dict__ . 如果仅包含 LogRecord 将发送到Web服务器,或者需要对发送到服务器的内容进行更具体的自定义。

emit(record)

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

注解

由于准备将记录发送到Web服务器与常规格式化操作不同,因此使用 setFormatter() 指定一个 Formatter 对于一个 HTTPHandler 没有效果。而不是调用 format() ,此处理程序调用 mapLogRecord() 然后 urllib.parse.urlencode() 以适合发送到Web服务器的形式对字典进行编码。

QueueHandler

3.2 新版功能.

这个 QueueHandler 类,位于 logging.handlers 模块,支持将日志消息发送到队列,例如 queuemultiprocessing 模块。

随着 QueueListener 类, QueueHandler 可用于让处理程序在单独的线程上执行其工作,而不是让执行日志记录的线程。这在Web应用程序和其他服务应用程序中很重要,在这些应用程序中,为客户端提供服务的线程需要尽可能快地响应,而任何可能缓慢的操作(如通过 SMTPHandler )在单独的线程上完成。

class logging.handlers.QueueHandler(queue)

返回的新实例 QueueHandler 类。实例初始化为要向其发送消息的队列。这个 队列 可以是任何类似于队列的对象;它被 enqueue() 方法,需要知道如何向其发送消息。队列不是 必修的 拥有任务跟踪API,这意味着您可以使用 SimpleQueue 的实例 队列 .

emit(record)

将准备日志记录的结果排队。如果发生异常(例如,由于有界队列已满),则 handleError() 调用方法来处理错误。这可能导致记录被静默删除(如果 logging.raiseExceptionsFalse )或者一条信息打印到 sys.stderr (如果 logging.raiseExceptionsTrue

prepare(record)

为排队准备记录。此方法返回的对象已排队。

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

如果要将记录转换为dict或json字符串,或者在保持原始记录不变的情况下发送记录的修改副本,则可能需要重写此方法。

enqueue(record)

使用将记录排入队列 put_nowait() ;如果要使用阻塞行为、超时或自定义队列实现,则可能需要重写此项。

QueueListener

3.2 新版功能.

这个 QueueListener 类,位于 logging.handlers 模块,支持从队列接收日志消息,例如 queuemultiprocessing 模块。消息从内部线程中的队列接收,并在同一线程上传递给一个或多个处理程序进行处理。同时 QueueListener 它本身不是一个处理程序,这里记录它是因为它与 QueueHandler .

随着 QueueHandler 类, QueueListener 可用于让处理程序在单独的线程上执行其工作,而不是让执行日志记录的线程。这在Web应用程序和其他服务应用程序中很重要,在这些应用程序中,为客户端提供服务的线程需要尽可能快地响应,而任何可能缓慢的操作(如通过 SMTPHandler )在单独的线程上完成。

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

返回的新实例 QueueListener 班级。该实例初始化为要向其发送消息的队列以及处理放置在队列上的条目的处理程序列表。队列可以是任何类似于队列的对象;它按原样传递给 dequeue() 方法,它需要知道如何从中获取消息。队列不是 必修的 拥有任务跟踪API(尽管它在可用的情况下被使用),这意味着您可以使用 SimpleQueue 的实例 队列 .

如果 respect_handler_levelTrue 在决定是否将消息传递给该处理程序时,将尊重处理程序的级别(与消息的级别相比);否则,行为与以前的Python版本相同—总是将每个消息传递给每个处理程序。

在 3.5 版更改: 这个 respect_handler_level 已添加参数。

dequeue(block)

将记录出列并返回,可以选择阻塞。

基本实现使用 get() . 如果要使用超时或使用自定义队列实现,则可能需要重写此方法。

prepare(record)

准备处理记录。

此实现只返回传入的记录。如果需要在将记录传递给处理程序之前对其进行任何自定义封送或操作,则可能需要重写此方法。

handle(record)

处理记录。

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

start()

启动侦听器。

这将启动一个后台线程来监视要处理日志记录的队列。

stop()

停止侦听器。

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

enqueue_sentinel()

将一个sentinel写入队列,告诉侦听器退出。此实现使用 put_nowait() .如果要使用超时或使用自定义队列实现,则可能需要重写此方法。

3.3 新版功能.

参见

模块 logging

日志模块的API引用。

模块 logging.config

日志模块的配置API。