python logging模块的简单使用(一)

前提

日志相信我们每天都会接触到,调试代码需要看console输出的日志、测试web程序需要看后台tomcat日志、测试手机应用需要看appium日志,所以日志还是非常重要的,于是最近了解了一下python logging模块,本文主要是Logging模块的一些用法简介,主要参考文章为Python 官方文档

简单的示例

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

这是官方文档的一个例子,后面已经给出提示,日志等级为warning时才会在控制台打印日志,而info并没有打印日志,原因是为什么呢?官方给出的解释是:

‘The INFO message doesn’t appear because the default level is WARNING.’

即默认的日志等级是warning,只有日志等级高于warning时才会打印日志,具体日志等级如下所示:

Level When it’s used
DEBUG Detailed information, typically of interest only when diagnosing problems.
INFO Confirmation that things are working as expected.
WARNING An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.
ERROR Due to a more serious problem, the software has not been able to perform some function.
CRITICAL A serious error, indicating that the program itself may be unable to continue running.

英文好的可以试着翻译一下,大概是:
debug: 查看详细信息,调试问题时会感兴趣
info: 确认程序按预期的运行
warning: 表明一些意外发生,或者预示一些问题即将发生(比如:磁盘空间不够)。软件仍然正常工作
error: 由于一个更严重的问题,软件已经无法执行一些功能
critical: 严重的错误,表明程序已经无法继续运行

输出日志到文件

上面完成了一个日志的简单打印到控制台,那么如果我们想把日志打印出来记录到文件中怎么办呢?
继续看一个官方给的例子:

import logging
logging.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')

运行这个文件,可以看到控制台没有输出任何日志信息,而在文件同级目录下,生成了一个example.log,打开log文件,可以看到文件内容为:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

example.png

每运行一次,文件不会覆盖之前的log,会在后面自动添加。
那么问题来了,如果想每次都生成新的日志,应该怎么办呢?
只需加上一个参数即可:

logging.basicConfig(filename='example.log',filemode='w',level=logging.DEBUG)

设置日志显示格式

上面完成了输出日志到控制台,输出日志到文件,而日志格式呢都是固定的,如果我们想自定义日志格式呢,官方也提供了解决方案。
一个官方给的例子:

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')

对应的在控制台打印效果如图所示:

output.png

对比上一张图:可以看到root不见了。ps:这边的logger就是默认的实例名称
如果想要加上时间,怎么办呢?也很简单,只要稍微修改一下format格式:

import logging
logging.basicConfig(format='%(asctime)s-%(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')

打印出来:

time-format.png

logging组件介绍

logging库一共有四个重要的组件:loggers, handlers, filters, and formatters.
官方文档是这样介绍的:

The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.

  • Loggers expose the interface that application code directly uses.
  • Handlers send the log records (created by loggers) to the appropriate destination.
  • Filters provide a finer grained facility for determining which log records to output.
  • Formatters specify the layout of log records in the final output.

大致翻译了一下:

  • Loggers 暴露了应用程序代码能直接使用的接口
  • Handlers 将(loggers产生的)日志记录发送到合适的目的地
  • Filters 提供了更好的粒度控制用来决定输出哪些日志记录
  • Formatters 明确了最终输出中日志记录的格式

Loggers

logging是通过调用logger 的方法来执行的,所以如果没有特意创建,会默认一个 root 的logger(上面有提到),创建一个logger:

logger = logging.getLogger(__name__)

logger实例创建后就可以进行日志等级设置、增加filter、增加handler等操作:

  • Logger.setLevel(logging.DEBUG) 设置日志等级为debug,即等级超过debug才会打印日志
  • Logger.addHandler 和 Logger.removeHandler 为Logger实例增加、删除一个处理器
  • Logger.addFilter 和 Logger.removeFilter 为Logger实例增加、删除一个过滤器

Handlers

官方文档示例介绍的handlers一共有两种:StreamHandler 和 FileHandler

The standard library includes quite a few handler types (see [Useful Handlers]; the tutorials use mainly StreamHandler and FileHandler in its examples.

当然还要其他 多种handlers ,感兴趣的童鞋可以去了解一下
其中StreamHandler ,主要用来向控制台输出日志

sends logging output to streams such as sys.stdout, sys.stderr or any file-like object

FileHandler,主要用来磁盘生成一个文件

sends logging output to a disk file

Formatters

Formatters主要用来设置日志的结构和消息内容,设置格式如下:

formatter = logging.Formatter('[%(asctime)s] - [%(levelname)s] - %(message)s')

一个完整的例子

官网提供了一下比较完整的例子,如下所示:

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.warn('warn message')
logger.error('error message')
logger.critical('critical message')

最终在控制台上输出结果为:

2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message

官方文档还介绍了配置相关,这边不在介绍,感兴趣的童鞋可以去看一下,再贴一下 官方文档

这一篇主要对官方文档的一个学习总结,下一篇将直接上干货介绍logger在接口测试、UI自动化测试中的使用

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

推荐阅读更多精彩内容