在 python 的标准库中,有了很多已经定义好的 Handler
, 这些 Handler
能覆盖我们在使用中的大部分情况, 包括将日志记录到文件中、将日志上传指定服务器等等,接下来就过一过这些 Handler
的基本信息。
1. StreamHandler
将日志消息发送到一个 File like
的流对象实例中。 一个 StreamHandler
的实例中,初始化时会持有一个 stream
参数,
初始化参数:
stream {object}
:File like object
, 如果有被赋值,则为我们自己赋值的流对象,如果为None
,则是 sys.stderr。
2. FileHandler
将日志记录到磁盘文件中.
初始化参数:
filename {str}
: 日志文件名。mode {str}
: 打开日志文件的模式,默认为a
,encoding {str}
: 打开日志文件的编码格式.delay {bool}
: 是否延时打开文件 Stream, 默认False
。为True
时,当使用的时候才会打开文件流,否则,初始化时就会打开。
3. BaseRotatingHandler(FileHandler)
在项目中,为了避免日志文件过大,需要切割日志文件,BaseRotatingHandler
就是切割日志文件处理类的基类。需使用继承自这个类的子类的实例, 不能直接使用。
需要子类实现 shouldRollover
、 doRollover
4. RotatingFileHandler (BaseRotatingHandler)
最简单继承了 BaseRotatingHandler
,新增的初始化参数
- maxBytes: 每个日志文件的最大
Byte
数。 文件大小达到了最大之后,就会把文件重命名,包括已经命名为.1
、.2
的文件,然后使用新的文件。 - backupCount: 日志文件的最大备份数目, 当数量大于1时,备份文件的是以
.1
,.2
…为文件扩展类型,例如test.log.5
。
5. TimedRotatingFileHandler(BaseRotatingHandler)
基于时间的文件日志处理类,可以根据时间点和时间间隔来切分日志,如每天的0点,每两个小时。有其固定定义的几种类型。
初始化参数:
-
when {str}
: 默认为h
, 不区分大小写。有一下可选* S - 基于秒 * M - 分钟 * H - 小时 * D - 天 * midnight - roll over at midnight * W{0-6} - 在某一天进行切分; 0 是周一
-
interval {int}
: 多少个when
进行日志切分。when='D', interval=2
: 表示 没两天进行切分,日志备份。 -
backupCount {int}
: 多少个备份数. -
utc {bool}
: 是否使用 当地时间,默认是False
, 不使用. -
atTime {object}
: 当when
为midnight
或W{0-6}
时使用,默认为None, None时, 指的是午夜, 如果不是,就是指定的时间点。
6. SocketHandler(Handler)
基于 TCP
的日志处理类,会将 LogRecord
实例中的__dict__
信息 和 堆栈信息 以 pickle
的方式序列化之后传输到 socket
服务端。
初始化参数: host
, port
7. DatagramHandler(SocketHandler)
基于 UDP
的日志处理类, 继承自 SocketHandler
.
8. SysLogHandler
将日志发送到 unix syslog
中。可以是远程的服务器也可以是本地的. 使用场景是系统层面的排错。
初始化参数:
address {tuple or str}
: 地址参数,一个元组, 默认是('localhost', SYSLOG_UDP_PORT)
, 也可以使用/dev/log
, 是一个Unix domain socket
, 传输速度快,用来进程间通信, 被用来发送消息到syslog
, 这个/dev/log
其实一个socket
文件。facility {int}
: 消息类型,并且对应到优先级。默认为LOG_USER
, 需要使用此类中定义好的变量。socktype
:socket
类型, 如果为空,使用socket.SOCK_DGRAM
9. NTEventLogHandler
window上,不做描述。
10.SMTPHandler
将日志文件用邮件方式发出.
初始化参数:
mailhost {tuple(host, port)}
:邮箱地址
fromaddr
: 发送人toaddrs
: 邮件接收人subject
: 邮件主题credentials
: 邮箱用户信息,( username, password)secure
:timeout
: 发送邮箱超时时间
11. MemoryHandler
将日志记录在内存中,当达到一定的量之后,统一发送到处理类中,处理类需要实现 handle(LogRecord)
方法
初始化参数:
capacity{int}
: 缓存的数量flushLevel
: 推送日志到目标的日志等级,默认为logging.ERROR
target
:日志最终处理类, 需要实现handle(LogRecord)
方法flushOnClose {bool}
: 是否需要在关闭时将日志推送处理,默认为True
12. HTTPHandler
将日志用 HTTP
的方式,发送给处理服务端。
13. QueueHandler
将日志信息放到一个 Queue
里面去,方便集中管理。
在以上的所有 Handler
中, 经常碰到的有:StreamHandler
, FileHandler
, RotatingFileHandler
, TimedRotatingFileHandler
。如果没有特殊的要求, TimedRotatingFileHandler
应该是最常用的处理类。
参考: