logging是什么

logging是一个忠实的贴身系统,是你代码路上的好帮手。它从一而终,至死不渝。准时出现在每一个你指定的地方,记录你代码路上的每一个里程碑事件。当你走完一程,回顾过去的时候,能够清晰地看见你留下的每一个脚印。

它通过(logger)进行简洁的操作,能够很方便地记录代码路上的重大事件;你可以定制脚印的形状(Formatter),无论是鸡脚还是鸭掌都是没有问题的;你也可以指定脚印存放的位置(Handler),是沙地上留痕的风(控制台),还是大地上留痕的水(本地文件),亦或者是太空中不灭的星辰(远程存储)。你还可以为每一个印记设置不同的等级(Filter),根据你的需要,记录或者不记录,留痕或者不留痕。

无论如何,这都是一个非常贴心的忠实系统,你完全可以信任它。

# 一个简单的版本
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')
# 一个高级的用法
import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')


Logger-简单而优雅的操作接口


而对应日志系统的构建者需要创建日志对象,设置对应的handler和Filter

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

同时需要注意一些事项:

  1. 默认情况下,logger只会显示"WARNING"级别以上的方法。如果要改变这一点,需要调用setlevel方法修改显示的级别。
  2. 日志的默认继承关系:日志默认通过名称来确定从属关系,这里的名称对应的是高级用法中的"simple_example",当有一个新的日志名称为"simple_example.abc"时,他会自动成为前者的下一级。那么如果不对新的日志做任何其他的配置操作,新的日志会自动使用上一级的配置。

对日志的使用者而言,基本上只需要关系下面的操作就好啦。

logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

只是需要注意下面一点:

  1. 如果你采用logger.debug("xxx %s", "yyy")的方法留下脚印,那么一定要注意:在"xxx"中有"%"的时候,需要将"%"转换成"%%",因为"%"在这个位置是所谓转义字符来用的,会导致日志打印出错。


Formatter-随心自由的表达方式

可以在此 页面 查看formatter可以使用的形式,和可以使用的关键字,同时也可以自定定义格式

Handler-灵活多变的存储原则

可以在此页面查看对象的详细信息

在此页面查看可以使用的handler

Filter-等级森严的显示秩序


值得注意的是,handler和logger都可以设置level。后者表示将level及以上的信息传递给handler,后者表示输出对应的level及以上的信息。

而对于level以下的信息:也许你不曾看见,但它都确实存在过。



链接

Logging HOWTO — Python 3.12.0 documentation