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的ORM框架SQLAlchemy入门教程
Apr 28 Python
Python用GET方法上传文件
Mar 10 Python
Python命令行参数解析模块getopt使用实例
Apr 13 Python
python实现中文分词FMM算法实例
Jul 10 Python
Python正则表达式知识汇总
Sep 22 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
NumPy统计函数的实现方法
Jan 21 Python
python打开文件的方式有哪些
Jun 29 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输入流php://input介绍
2012/09/18 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python编程中的异常处理教程
2015/08/21 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python简单实现最大似然估计&scipy库的使用详解
2020/04/15 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
互联网创业计划书的书写步骤
2014/01/28 职场文书
建议书怎么写
2014/03/12 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
大学生创业事迹材料
2014/12/30 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers