Python日志模块介绍

logging是python自带的标准库,无需使用pip进行安装。

import logging

日志模块作用

  • 用于程序开发过程中的调试运行记录
  • 可以输出到日志文件,方便开发人员和运维人员对已经在现场部署程序的运行状态的掌握,若程序报错或运行结果不对,可根据日志文件进行错误定位

日志级别

logging模块预定义了5种日志级别,并根据它们所跟踪的事件的级别或严重程度来命名,具体如下:

Level Numeric Value When it's used
DEBUG 10 报告详细的程序运行结果,用于调试
INFO 20 报告程序正常运行期间发生的事件,或一些结果记录,确认程序在按照预期进行。
WARNING 30 发出关于特定运行时事件的警告,说明程序本身对这种情况的处理是无能为力的,但是依然需要报告该情况。(例如输入数据小于0等不是由于算法造成的情况)
ERROR 40 报告异常,由于一个更严重的问题,程序已经不能执行一些功能。
CRITICAL 50 表明程序本身可能无法继续运行。

注意:

  • 在配置日志模块时,需要设定日志级别,低于该日志级别的日志记录将不会被打印输出。(默认级别是WARNING

  • 可以自己自定义新的日志级别,当新定义的numeric value与预定义的value重复时,预定义的级别将会被覆盖

日志模块的四个重要组件

  • Loggers:算法与日志模块的接口

  • Handlers:将日志记录发送到指定的目标(控制台、文件、邮件等)

  • Formatters:指定最终输出中日志记录的样式。

  • Filters:为确定输出哪些日志记录提供了更细粒度的工具。

Loggers

Logger对象有三个功能:

  • 提供接口给算法,算法在运行时通过调用这些接口来记录日志
  • 根据级别或过滤对象确定要对哪些日志消息进行操作(to Handles)。
  • 将日志消息传递给所有与之相关的处理器。

Logger对象的使用最广泛的方法主要是:配置和记录消息

常用配置:
  • Logger.setLever(): 用于设置日志级别
  • Logger.addHandler(): 添加处理器
  • Logger.addFilter(): 添加过滤器
记录消息

当配置了Logger对象后,就可以使用Logger.debug(), Logger.info(), Logger.warning, Logger.error, Logger.critical() 方法来创建日志消息,只需将需要记录的消息写进括号内即可

所有需要被记录的消息实际上是一个字符串,它可以包含标准字符串替换语法%s%d%f等来实现具体数据的输出。

Handlers

Handler对象负责将日志消息(基于日志消息的严重性)分派给处理器的指定目标。在上一步中提到,可以使用Logger.addHandler()来添加零个或多个处理器对象。例如,算法可以将所有日志消息都发送到控制台,将ERROR或者更高级别的消息发送到磁盘文件。这就需要两个单独的处理器。

处理器有很多种类,常用的主要有以下几种:

  • StreamHandler: 将日志记录输出到数据流(例如sys.stdout, sys.stderr, 或者任何文件类对象)

  • FileHandler:将日志记录输出到磁盘文件中,它继承了StreamHandler的输出

  • RotatingFileHandler:支持磁盘日志文件按文件大小轮换。当文件即将超出预定大小时,将关闭旧文件并打开一个新文件用于输出。

  • TimedRotatingFileHandler:支持磁盘日志文件按照特定时间间隔轮换。

Formatters

Formatter对象是用来配置日志消息的最终输出形式。其格式由%(<dictionary key>)s这样的表达形式来组合成字符串。例如:

'%(asctime)s - %(levelname)s - %(message)s'

其中,可以设置的<dictionary key>可参考LogRecord属性

配置日志模块

将日志记录输出在控制台
import logging

# 创建一个logger实例并设置日志级别
logger = logging.getLogger('alg_name')
logger.setLevel(logging.DEBUG)

# 配置handler,拟将日志记录输出在控制台
stdout_handler = logging.StreamHandler()

# 配置formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stdout_handler.setFormatter(formatter)

# 添加handler至logger
logger.addHandler(stdout_handler)

配置完后,我们就可以在我们算法想要进行日志记录的地方调用Logger.debug(), Logger.info(), Logger.warning, Logger.error, Logger.critical()来进行日志输出了。比如:

# 下面的内容都是写在算法文件里你需要的地方
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

当运行算法时,你会看到控制台输出以下内容

2005-03-19 15:10:26,618 - alg_name - DEBUG - debug message
2005-03-19 15:10:26,620 - alg_name - INFO - info message
2005-03-19 15:10:26,695 - alg_name - WARNING - warn message
2005-03-19 15:10:26,697 - alg_name - ERROR - error message
2005-03-19 15:10:26,773 - alg_name - CRITICAL - critical message
将日志记录输出至日志文件
import logging

# 创建一个logger实例并设置日志级别
logger = logging.getLogger('alg_name')
logger.setLevel(logging.DEBUG)

# 配置handler,拟将日志记录输出至/log/文件夹
file_name = './log/alg_name_log.log'  # 注意:如果/log/文件夹不存在,则需要新建
file_handler = logging.handlers.TimedRotatingFileHandler(file_name, when='MIDNIGHT', interval=1, backupCount=30)  # 每天午夜生成alg_name_log.log文件,最多保留30天

# 配置formatter
formatter = logging.Formatter('%(levelname)s - %(asctime)s [%(filename)s:%(lineno)d] %(message)s \n')
file_handler.setFormatter(formatter)

# 添加handler至logger
logger.addHandler(file_handler)
参考链接

https://docs.python.org/3/howto/logging.html#logging-howto

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容