15.9. logging.handlers — 日志处理程序 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/logging.handlers
跳转至:导航、​搜索

15.9. 日志处理程序 — 日志处理程序

重要的

此页面仅包含参考信息。 有关教程,请参阅

源代码: :source:`Lib/logging/handlers.py`



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

15.9.1. 流处理器

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

class logging.StreamHandler(stream=None)

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

emit(record)

如果指定了格式化程序,则它用于格式化记录。 然后将记录写入带有换行符终止符的流中。 如果存在异常信息,则使用 traceback.print_exception() 对其进行格式化并附加到流中。

flush()

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


15.9.2. 文件处理器

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

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

返回 FileHandler 类的新实例。 指定的文件被打开并用作记录流。 如果未指定 mode,则使用 'a'。 如果 encoding 不是 None,则使用该编码打开文件。 如果 delay 为真,则文件打开将推迟到第一次调用 emit()。 默认情况下,文件无限增长。

2.6 版更改:添加了 延迟

close()

关闭文件。

emit(record)

将记录输出到文件。


15.9.3. 空处理器

2.7 版中的新功能。


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

class logging.NullHandler

返回 NullHandler 类的新实例。

emit(record)

这个方法什么都不做。

handle(record)

这个方法什么都不做。

createLock()

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

有关如何使用 NullHandler 的更多信息,请参阅 为库配置日志记录


15.9.4. 监视文件处理程序

2.6 版中的新功能。


WatchedFileHandler 类位于 logging.handlers 模块中,是一个 FileHandler,它监视它正在记录到的文件。 如果文件发生更改,则会关闭并使用文件名重新打开。

由于使用了执行日志文件轮换的程序,例如 newsysloglogrotate,可能会发生文件更改。 此处理程序旨在在 Unix/Linux 下使用,监视文件以查看自上次发出以来它是否已更改。 (如果文件的设备或 inode 已更改,则认为文件已更改。)如果文件已更改,则关闭旧文件流,并打开文件以获取新流。

此处理程序不适合在 Windows 下使用,因为在 Windows 下无法移动或重命名打开的日志文件 - 日志记录使用排他锁打开文件 - 因此不需要这样的处理程序。 此外,Windows 下不支持 ST_INOstat() 对于这个值总是返回零。

class logging.handlers.WatchedFileHandler(filename[, mode[, encoding[, delay]]])
返回 WatchedFileHandler 类的新实例。 指定的文件被打开并用作记录流。 如果未指定 mode,则使用 'a'。 如果 encoding 不是 None,则使用该编码打开文件。 如果 delay 为真,则文件打开将推迟到第一次调用 emit()。 默认情况下,文件无限增长。
emit(record)
将记录输出到文件,但首先检查文件是否已更改。 如果是,则在将记录输出到文件之前,刷新并关闭现有流并再次打开文件。


15.9.5. 旋转文件处理器

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

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

返回 RotatingFileHandler 类的新实例。 指定的文件被打开并用作记录流。 如果未指定 mode,则使用 'a'。 如果 encoding 不是 None,则使用该编码打开文件。 如果 delay 为真,则文件打开将推迟到第一次调用 emit()。 默认情况下,文件无限增长。

您可以使用 maxBytesbackupCount 值来允许文件以预定大小 rollover。 当即将超过大小时,将关闭文件并静默打开一个新文件进行输出。 每当当前日志文件的长度接近 maxBytes 时,就会发生翻转; 如果 maxBytesbackupCount 中的任何一个为零,则不会发生翻转。 如果 backupCount 非零,系统将通过将扩展名“.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 等。 分别。

2.6 版更改:添加了 延迟

doRollover()

进行翻转,如上所述。

emit(record)

将记录输出到文件,满足前面所述的翻转。


15.9.6. 定时旋转文件处理器

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

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

返回 TimedRotatingFileHandler 类的新实例。 指定的文件被打开并用作记录流。 旋转时,它还设置文件名后缀。 旋转基于when间隔的乘积。

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

价值

间隔类型

'S'

'M'

分钟

'H'

小时

'D'

'W0'-'W6'

工作日(0=星期一)

'midnight'

半夜翻身

使用基于工作日的轮换时,为星期一指定 'W0',为星期二指定 'W1',以此类推,直到星期日指定为 'W6'。 在这种情况下,不使用为 interval 传递的值。

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

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

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

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

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

2.6 版更改:添加了 delayutc

doRollover()

进行翻转,如上所述。

emit(record)

将记录输出到文件,满足上述翻转。


15.9.7. 套接字处理程序

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

class logging.handlers.SocketHandler(host, port)

返回 SocketHandler 类的新实例,旨在与远程机器通信,其地址由 hostport 给出。

close()

关闭套接字。

emit()

Pickles 记录的属性字典并以二进制格式将其写入套接字。 如果套接字出现错误,则静默丢弃数据包。 如果连接先前丢失,则重新建立连接。 要将接收端的记录解压缩为 LogRecord,请使用 makeLogRecord() 函数。

handleError()

处理在 emit() 期间发生的错误。 最可能的原因是连接丢失。 关闭套接字以便我们可以重试下一个事件。

makeSocket()

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

makePickle(record)

以带有长度前缀的二进制格式腌制记录的属性字典,并返回它准备好通过套接字传输。

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

send(packet)

将腌制的字符串 packet 发送到套接字。 此功能允许在网络繁忙时可能发生的部分发送。

createSocket()

尝试创建套接字; 在失败时,使用指数退避算法。 在初始失败时,处理程序将丢弃它试图发送的消息。 当后续消息由同一个实例处理时,它不会尝试连接,直到一段时间过去。 默认参数是这样的,初始延迟是一秒,如果在延迟之后仍然无法建立连接,处理程序将每次延迟加倍,最多 30 秒。

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

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

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

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

这意味着如果远程侦听器在 处理程序被使用后启动 ,您可能会丢失消息(因为处理程序在延迟过去之前甚至不会尝试连接,而是在处理过程中默默地丢弃消息)延迟时间)。


15.9.8. 数据报处理器

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

class logging.handlers.DatagramHandler(host, port)

返回 DatagramHandler 类的新实例,用于与远程机器通信,其地址由 hostport 给出。

emit()

Pickles 记录的属性字典并以二进制格式将其写入套接字。 如果套接字出现错误,则静默丢弃数据包。 要将接收端的记录解压缩为 LogRecord,请使用 makeLogRecord() 函数。

makeSocket()

SocketHandler 的工厂方法在这里被覆盖以创建一个 UDP 套接字(socket.SOCK_DGRAM)。

send(s)

将腌制的字符串发送到套接字。


15.9.9. 系统日志处理程序

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) 元组的替代方法是将地址作为字符串提供,例如“/dev/log”。 在这种情况下,使用 Unix 域套接字将消息发送到系统日志。 如果未指定 facility,则使用 LOG_USER。 打开的套接字类型取决于 socktype 参数,默认为 socket.SOCK_DGRAM,因此打开一个 UDP 套接字。 要打开 TCP 套接字(用于与 rsyslog 等较新的 syslog 守护程序一起使用),请指定值 socket.SOCK_STREAM

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

2.7 版更改:添加了 socktype

close()

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

emit(record)

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

encodePriority(facility, priority)

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

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

优先事项

名称(字符串)

象征价值

alert

LOG_ALERT

critcritical

LOG_CRIT

debug

日志调试

emergpanic

LOG_EMERG

errerror

日志错误

info

日志信息

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

登录用户

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 映射到等效的系统日志名称,并将所有其他级别名称映射到'警告'。


15.9.10。 NTEventLogHandler

NTEventLogHandler 类位于 logging.handlers 模块中,支持将日志消息发送到本地 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' - 这与 Win32 一起安装)扩展并包含一些基本的占位符消息定义。 请注意,使用这些占位符会使您的事件日志变大,因为整个消息源都保存在日志中。 如果您想要更精简的日志,则必须传入您自己的 .dll 或 .exe 的名称,其中包含要在事件日志中使用的消息定义)。 日志类型'Application''System''Security' 之一,默认为 'Application'

close()

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

emit(record)

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

getEventCategory(record)

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

getEventType(record)

返回记录的事件类型。 如果您想指定自己的类型,请覆盖它。 此版本使用处理程序的 typemap 属性进行映射,该属性在 __init__() 中设置到包含 DEBUGINFOWARNING 映射的字典, ERRORCRITICAL。 如果您使用自己的级别,则需要覆盖此方法或在处理程序的 typemap 属性中放置一个合适的字典。

getMessageID(record)

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


15.9.11。 SMTP处理程序

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

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

返回 SMTPHandler 类的新实例。 该实例使用电子邮件的发件人和收件人地址以及主题行进行初始化。 toaddrs 应该是一个字符串列表。 要指定非标准 SMTP 端口,请对 mailhost 参数使用 (host, port) 元组格式。 如果使用字符串,则使用标准 SMTP 端口。 如果您的 SMTP 服务器需要身份验证,您可以为 credentials 参数指定一个(用户名、密码)元组。

要指定使用安全协议 (TLS),请将元组传递给 secure 参数。 这仅在提供身份验证凭据时使用。 元组应该是一个空元组,或者一个带有密钥文件名称的单值元组,或者一个带有密钥文件和证书文件名称的 2 值元组。 (这个元组被传递给 smtplib.SMTP.starttls() 方法。)

在 2.6 版更改:添加了 凭据

在 2.7 版更改:添加了 secure

emit(record)

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

getSubject(record)

如果要指定与记录相关的主题行,请覆盖此方法。


15.9.12。 内存处理器

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)

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

close()

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

flush()

对于 MemoryHandler,刷新意味着只是将缓冲的记录发送到目标,如果有的话。 发生这种情况时,缓冲区也会被清除。 如果您想要不同的行为,请覆盖。

setTarget(target)

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

shouldFlush(record)

检查缓冲区已满或 flushLevel 或更高的记录。


15.9.13。 HTTP处理程序

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

class logging.handlers.HTTPHandler(host, url, method='GET')

返回 HTTPHandler 类的新实例。 host 可以采用 host:port 的形式,如果您需要使用特定的端口号。

mapLogRecord(record)

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

emit(record)

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

笔记

由于准备将记录发送到 Web 服务器的记录与通用格式化操作不同,因此使用 setFormatter()HTTPHandler 指定 Formatter 无效。 该处理程序不调用 format(),而是调用 mapLogRecord()urllib.urlencode() 以适合发送到网络服务器。

也可以看看

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