Python logging 模块简介

来源:互联网 发布:《算法统宗》甲牵一只 编辑:程序博客网 时间:2024/06/06 03:57

Table of Contents

  • 1. Logging 模块
    • 1.1. 简介
    • 1.2. 简单输出日志
    • 1.3. 输入日志到文件
    • 1.4. 几个基本概念
      • 1.4.1. loggers
      • 1.4.2. handlers 和轮转日志
      • 1.4.3. Formatters 和 个性化输出
    • 1.5. 其它
      • 1.5.1. logger.exception
      • 1.5.2. Filter Object
      • 1.5.3. 线程安全
      • 1.5.4. Logging Flow
      • 1.5.5. 从配置文件获取logging的配置
  • 2. 参考资料

Logging 模块

简介

Python的 logging 模块提供了灵活的日志处理相关功能, 可以用来追踪程序运行的情况。

logging 模块提供了一系列标准的日志等级: DEBUG, INFO, WARNING, ERROR, CRITICAL, 顾名思义可以大致看出它们各自的使用情况。 logging 模块设置的默认等级时 WARNING, 这意味着默认情况下,日志级别为 WARNING, ERROR, CRITICAL 的日志会被记录,而 DEBUG, INFO 的日志会被忽略。

不同等级的value值如下,只有当value大于 logger 的值才会记录日志。

Level    ValueCRITICAL 50ERROR    40WARNING  30INFO     20DEBUG    10UNSET     0

简单输出日志

下面看一个简单的官方文档上的例子:

import logginglogging.warning('Watch out!')  # will print a message to the consolelogging.info('I told you so')  # will not print anything

输出如下:

WARNING:root:Watch out!

可以看到info记录的信息没有输出,这是因为默认输出级别不低于WARNING级别的。

输入日志到文件

logging 支持输出日志到文件,参考下面示例:

import logginglogging.basicConfig(filename='example.log',level=logging.DEBUG)logging.debug('This message should go to the log file')logging.info('So should this')logging.warning('And this, too')

其中level是指的记录等级, 输出如下:

DEBUG:root:This message should go to the log fileINFO:root:So should thisWARNING:root:And this, too

几个基本概念

loggers

logger是logging模块提供的日志类 Logger 的实例,它暴露出接口可以直接供程序调用。
每个实例都有一个名字,并且示例间有类之间那种继承关系,根据logger的名字来区分,比如叫”scan”的logger是叫”scan.text”和”scan.html”的父类(没错,他们是以点号错分隔符)。

所有logger共同的父类是 root , 就是上面示例中的中间那个默认的root。 basicConfig 默认的输出格式为: severity:logger name:message

logger的通过 logging.getLogger(name) 来创建,有种在包里命名的惯用做法是:

logger = logging.getLogger(__name__)

这样的好处是可以从logger的名字清楚的看到记录的来源。

handlers 和轮转日志

handlers 承担 logging 模块里负责处理合适的信息到不同的地方的角色,下面通过设置一个RotatingFileHandler来展示handler的特性。

有时候需要创建多个轮转日志,每个日志保存一定长度的内容,最多保留一定数量的日志,其余的丢弃,这种情况下,可以定义 RotatingFileHandler 来实现:

logging_rotatingfile_example.pyimport globimport loggingimport logging.handlersLOG_FILENAME = 'logging_rotatingfile_example.out'# Set up a specific logger with our desired output levelmy_logger = logging.getLogger('MyLogger')my_logger.setLevel(logging.DEBUG)# Add the log message handler to the loggerhandler = logging.handlers.RotatingFileHandler(    LOG_FILENAME,    maxBytes=20,    backupCount=5,)my_logger.addHandler(handler)# Log some messagesfor i in range(20):    my_logger.debug('i = %d' % i)# See what files are createdlogfiles = glob.glob('%s*' % LOG_FILENAME)for filename in logfiles:    print(filename)

运行输出如下:

logging_rotatingfile_example.outlogging_rotatingfile_example.out.1logging_rotatingfile_example.out.2logging_rotatingfile_example.out.3logging_rotatingfile_example.out.4logging_rotatingfile_example.out.5

当日志内容达到定义的 maxBytes 时,会自动重命名文件后加上后缀”.1”,如果已经存在后续的”.1”,”.2”等则自动重命名他们向后加1,最后最多只保留 backupCount 定义数量的日志文件。

其它有用的handler参见这里。

Formatters 和 个性化输出

Formatters 可以用来控制日志输出的格式,参考下面的示例:

import logging# create loggerlogger = logging.getLogger('simple_example')logger.setLevel(logging.DEBUG)# create console handler and set level to debugch = logging.StreamHandler()ch.setLevel(logging.DEBUG)# create formatterformatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# add formatter to chch.setFormatter(formatter)# add ch to loggerlogger.addHandler(ch)# 'application' codelogger.debug('debug message')logger.info('info message')logger.warn('warn message')logger.error('error message')logger.critical('critical message')

输出如下:

2016-11-27 23:18:51,128 - simple_example - DEBUG - debug message2016-11-27 23:18:51,128 - simple_example - INFO - info message2016-11-27 23:18:51,128 - simple_example - WARNING - warn message2016-11-27 23:18:51,128 - simple_example - ERROR - error message2016-11-27 23:18:51,128 - simple_example - CRITICAL - critical message

可以看到 %(asctime)s - %(name)s - %(levelname)s - %(message)s 这里对格式化输出的影响。
其中默认的日期时间显示的格式是ISO8601格式, 也可以自定义时间格式,如下面的例子:

import logginglogging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')logging.warning('is when this event was logged.')

输出:

python test12.py11/27/2016 11:22:41 PM is when this event was logged.

好有个比较有用的格式化参数时 %(lineno)d, 显示logger调用的时候所处的行数。具体的格式和作用可以参见这里。

其它

logger.exception

ERROR 的等级记录日志,但和 DEBUG 等级一样会输出详细的错误信息,通常用在exception处理中

Filter Object

Filters 是可以被handlers和loggers用来过滤日志的输出的,因为用的不多,具体可参见文档。

线程安全

logging模块是通过线程锁保证线程安全的。

Logging Flow

官方文档上看到的logging流程图,可以帮助理解日志记录流程,参见这里。

从配置文件获取logging的配置

参见这里。

参考资料

  • https://docs.python.org/2.7/howto/logging.html
  • https://pymotw.com/3/logging/index.html#module-logging
0 0
原创粉丝点击