76. python如何输出log

在一个后台应用程序中,经常会有这样的需求,输出程序的运行事件到一个文件中,以便管理员进行事后 问题分析和定位。

在linux中,系统提供了syslog机制,程序可以调用syslog函数来将事件写入文件中,并且可以统一的控制 事件的输出级别。

在python中,有一个模块logging提供了类似的功能。它实现了非常方便的事件记录机制。它主要包含三个 功能 :

  • 输出程序的事件并发送到相应的文件或远端IP.

  • 统一控制事件的输出级别。

  • 格式化程序输出到日志文件中的格式。

logging 的输出级别包含以下几个,数字越大,表示越重要。

  • CRITICAL 50

  • ERROR 40

  • WARNING 30

  • INFO 20

  • DEBUG 10

下面代码将日志输出到文件syslog.log中,并且输出级别为INFO, 大于等于INFO级别的均会输出, 小于INFO级别的不会输出到文件中:

import logging
logging.basicConfig(filename='syslog.log',level=logging.INFO)
logging.debug('This message not  to the log file')
logging.info('hello china')
logging.warning('hello beijing')

其中”hello china”和”hello beijing”会输出到syslog.log文件中,其他的不会输出到log文件中。

如果不调用basicConfig函数对输出文件和级别进行控制,默认的输出级别为WARNING,并且默认输出到屏幕中。

如果需要像syslog一样将事件消息可以输出到一个远端的服务器上,那就需要和SysLogHandler类配合使用,函数原型:

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

详见: https://docs.python.org/3.6/library/logging.handlers.html