python的日志模块logging

Python的logging模块提供了通用的日志系统,支持debug、info、warn、error、critical多种级别日志,可以方便第三方模块或者应用使用。

1. 日志模块loging的简单案例

#! /usr/bin/env python

#  -*-  coding:utf-8  -*-

import logging

        logging.basicConfig(filename= 'logger.log',  level=logging.ERROR)

        logging.debug('debug message')

        logging.info('info message')

        logging.warn('warn message')

        logging.error('error message')

        logging.critical('critical message')

logging.info等可以在程序的合适地方打印,在logger.log文件中打印如下:

        ERROR:root:error message

        CRITICAL:root:critical message

因为通过level=logging.ERROR设置日志级别为ERROR,所以输出日志级别大于ERROR的日志信息。

logging日志级别
2. logging的重要概念
logging树形结构

1. Logger

Logger是一个树形层级结构,在使用debug、info、warn、error、critical之前必须创建Logger实例,即创建一个记录器,如果没有显式地进行创建,则默认创建一个root logger,应用默认的日志级别(WARN)、处理器Handler(StreamHandler将日志输出在标准输出设备上)和格式化器Formatter(默认的格式为ERROR:root:error message日志级别:实例名称:日志信息)。

创建方法:

logger=logging.getLogger(logger_name)

创建Logger实例后,使用以下方法进行日志级别设置,增加处理器Handler。

❑ logger.setLevel(logging.ERROR):设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出。

❑ logger.addHandler(handler_name):为Logger实例增加一个处理器。

❑ logger.removeHandler(handler_name):为Logger实例删除一个处理器。

Logger可以包含一个或多个Handler和Filter,也就是说Logger与Handler或Fitler是一对多的关系;一个Logger实例可以新增多个Handler,一个Handler可以新增多个Formatter或多个Filter,而且日志级别将会继承

2. Handler

Handler处理器常用类型有StreamHandler、FileHandler、NullHandler,点击查看参数使用说明

StreamHandler创建方法:  sh = logging.StreamHandler(stream=None)

创建StreamHandler后,设置日志级别,设置格式化器Formatter,增加或删除过滤器Filter,使用例子参考网上案例

❑ sh.setLevel(logging.WARN):指定日志级别,低于WARN级别的日志将被忽略。

❑ sh.setFormatter(formatter_name):设置一个格式化器formatter。

❑ sh.addFilter(filter_name):增加一个过滤器,可以增加多个。

❑ sh.removeFilter(filter_name):删除一个过滤器。

FileHandler创建方法:

fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)

NullHandler创建方法:logging.NullHandler

3.Filter

Handler和Logger可以使用Filter来完成比级别更复杂的过滤。Filter基类只允许特定Logger层次以下的事件。例如,用’A.B’初始化的Filter允许Logger  'A.B'、 'A.B.C'、 'A. B.C.D'、 'A.B.D’等记录的事件,logger'A.BB'、'B.A.B’等就不行。如果用空字符串来初始化,所有的事件都接受。

创建方法:filter = logging.Filter(name='')

备注:A.B是啥?看不懂

4.Formatter

Formatter对象可以设置日志信息的规则、结构和内容,以及时间格式。

创建方法:formatter = logging.Formatter(fmt=None, datefmt=None)

其中,fmt是消息的格式化字符串,datefmt是日期字符串默认使用ISO8601日期格式%Y-%m-%d %H:%M:%S。

3. logging模块使用方法

1. import  logging

第一次导入logging模块或使用reload函数重新导入logging模块,logging模块中的代码将被执行,这个过程中将产生logging日志系统的默认配置。

2. 自定义配置(可选)

logging.basicConfig(filename= 'logger.log', level=logging.ERROR)

logging.config.fileConfig("./logging.conf")

logging.config.dictConfig(config)

logging.config.listen(port=DEFAULT_LOGGING_CONFIG_PORT)

logging模块支持配置方式:basicConfig、 dictConfig、fileConfig、listen。dictConfig通过一个字典配置Logger、Handler、Filter 、Formatter;fileConfig通过一个文件进行配置;listen则监听一个网络端口,通过接收网络数据来进行配置。

basicConfig关键字

常用的format格式如下

常用的format格式

3. 创建一个Logger对象实例

用logging模块的全局作用域中的getLogger函数来得到一个Logger对象实例。

logger=logging.getLogger(logger_name)

4. 用Logger对象实例记录日志

用Logger对象中的debug、info、error、warn、critical等方法记录日志信息。

logging.info('info message')

4. logging模块处理流程

1)判断日志的等级是否大于Logger对象的等级,如果大于,则往下执行,否则,流程结束。

2)产生日志。第一步,判断是否有异常,如果有,则添加异常信息。第二步,处理日志记录方法(如debug、info等)中的占位符,即一般的字符串格式化处理。

3)使用注册到Logger对象中的Filters进行过滤。如果有多个过滤器,则依次过滤;只要有一个过滤器返回假,则过滤结束,且该日志信息将丢弃,不再处理,而处理流程也至此结束。否则,处理流程往下执行。

4)在当前Logger对象中查找Handler,如果找不到任何Handler,则往上到该Logger对象的父Logger中查找;如果找到一个或多个Handler,则依次用Handler来处理日志信息。但在每个Handler处理日志信息过程中,会首先判断日志信息的等级是否大于该Handler的等级,如果大于,则往下执行(由Logger对象进入Handler对象中),否则,处理流程结束。

5)执行Handler对象中的filter方法,该方法会依次执行注册到该Handler对象中的Filter。如果有一个Filter判断该日志信息为假,则此后的所有Filter都不再执行,而直接将该日志信息丢弃,处理流程结束。

6)使用Formatter类格式化最终的输出结果。注:Formatter同“产生日志”第二步的字符串格式化不同,它会添加额外的信息,如日志产生的时间、产生日志的源代码所在的源文件的路径等。

7)真正地输出日志信息(到网络、文件、终端、邮件等)。至于输出到哪个目的地,由Handler的种类来决定。

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

推荐阅读更多精彩内容

  • 本文参考自:https://www.cnblogs.com/Nicholas0707/p/9021672.html...
    handsomePeng阅读 1,393评论 1 4
  • 本文章是我大概三年前,在上家单位使用 Python 工作时结合官方文档做的整理。现在 Python 官方文档听说已...
    好吃的野菜阅读 215,514评论 14 232
  • (一)、日志相关概念 1、日志的作用 通过log的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用l...
    Rainy丶Wang阅读 594评论 0 0
  • logging介绍Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块...
    modingfa阅读 6,807评论 0 2
  • 蜷缩在椅子下的它,浑身雪白,葡萄般大的眼睛溢出了一股灵气。懒懒的样子实在可爱至极。松散的眼神眨着。 五日的阳光照到...