Python logging模块学习笔记


Posted in Python onMay 24, 2014

模块级函数

logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root logger
logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical():设定root logger的日志级别
logging.basicConfig():用默认Formatter为日志系统建立一个StreamHandler,设置基础配置并加到root logger中

示例:logging_level_example.py

import logging
import sysLEVELS = {'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL}
if len(sys.argv) > 1:
    level_name = sys.argv[1]
    level = LEVELS.get(level_name, logging.NOTSET)
    logging.basicConfig(level=level)
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical error message')

输出:
$ python logging_level_example.py debug
DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message
$ python logging_level_example.py info
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message

Loggers

Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别

示例:simple_logging_module.py

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

输出:
$ python simple_logging_module.py
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

Handlers

handler对象负责发送相关的信息到指定目的地。可以通过addHandler()方法添加多个多handler
Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():给这个handler选择一个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象

Formatters

Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S,下面是Formatter常用的一些信息

%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息

最后来个完整例子:

import logging# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)
# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')
# Now, define a couple of other loggers which might represent areas in your
# application:
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')
logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')

运行后,在终端看到的结果

root        : INFO     Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO     How quickly daft jumping zebras vex.
myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR    The five boxing wizards jump quickly.

在日志文件中的结果

10-22 22:19 root         INFO     Jackdaws love my big sphinx of quartz.
10-22 22:19 myapp.area1  DEBUG    Quick zephyrs blow, vexing daft Jim.
10-22 22:19 myapp.area1  INFO     How quickly daft jumping zebras vex.
10-22 22:19 myapp.area2  WARNING  Jail zesty vixen who grabbed pay from quack.
10-22 22:19 myapp.area2  ERROR    The five boxing wizards jump quickly.

发现DEBUG信息只有在文件中出现,这是因为StreamHandler中setLevel是INFO,可以看出Logger.setLevel()和handler.setLevel()的区别

详细信息请参阅 http://docs.python.org/library/logging.html

Python 相关文章推荐
python 生成目录树及显示文件大小的代码
Jul 23 Python
python求crc32值的方法
Oct 05 Python
Python中Django 后台自定义表单控件
Mar 28 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
浅析PHP与Python进行数据交互
May 15 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
详解flask入门模板引擎
Jul 18 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
利用python中集合的唯一性实现去重
Feb 11 Python
python基础之匿名函数详解
Apr 21 Python
Python学习笔记之常用函数及说明
May 23 #Python
从零学python系列之教你如何根据图片生成字符画
May 23 #Python
从零学python系列之从文件读取和保存数据
May 23 #Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 #Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
May 23 #Python
从零学python系列之数据处理编程实例(二)
May 22 #Python
从零学python系列之数据处理编程实例(一)
May 22 #Python
You might like
php checkbox 取值详细说明
2010/08/19 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
Python列表推导式的使用方法
2013/11/21 Python
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
Python中format()格式输出全解
2019/04/12 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
python 利用zmail库发送邮件
2020/09/11 Python
详解Python中第三方库Faker
2020/09/25 Python
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
几道PHP面试题
2013/04/14 面试题
《莫泊桑拜师》教学反思
2014/04/23 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
班主任经验交流材料
2014/12/16 职场文书
认识实习感想
2015/08/10 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
mysql数据库实现设置字段长度
2022/06/10 MySQL