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下的subprocess模块的入门指引
Apr 16 Python
python创建临时文件夹的方法
Jul 06 Python
解决python爬虫中有中文的url问题
May 11 Python
python中字符串内置函数的用法总结
Sep 13 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
Python3.7 pyodbc完美配置访问access数据库
Oct 03 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
python 用struct模块解决黏包问题
Nov 07 Python
Python实现随机爬山算法
Jan 29 Python
python for循环赋值问题
Jun 03 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
PHPlet在Windows下的安装
2006/10/09 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
javascript中 try catch用法
2015/08/16 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
JavaScript模拟push
2016/03/06 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
基于Python pip用国内镜像下载的方法
2018/06/12 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
简述数组与指针的区别
2014/01/02 面试题
求职者简历中的自我评价
2013/10/20 职场文书
竞选班长演讲稿
2013/12/30 职场文书
大学生演讲稿范文
2014/01/11 职场文书
元旦晚会邀请函
2014/01/27 职场文书
中学生差生评语
2014/01/30 职场文书
学习十八届三中全会精神实施方案
2014/02/17 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
初中教师个人总结
2015/02/10 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书