python日志浅析
输出日志对于追踪问题比较重要。
默认logger(root)
python使用logging模块来处理日志。通常下面的用法就能满足常规需求:
import logging
logging.debug('some debug level info....')#debug级别消息
logging.info('some info level info...')#info级别消息
logging.warn('some warning level info...')#warning级别消息
logging.critical('some critical level info...')#critical级别消息
logging.error('some error level info...')#error级别消息
输出类似:
[2015-01-07 10:11:34,579](DEBUG)root : adsfaf
即:
[时间](级别)logger名称:消息
默认输出到console。
自定义logger
如果某个模块有个性的需求,比如,记录到文件,或者发送邮件。那么问题来了,怎么破?
如果发生了某种严重的情况,想要发送邮件的话,需要自己定义一个logger,并设置好级别(setLevel(logging.CRITICAL))以及处理器(logging.handlers.SMTPHandler),demo如下:
import logging
logger = logging.getLogger('email_logger')
logger.setLevel(logging.CRITICAL)
mail_handler= logging.handlers.SMTPHandler('your_mail_host_ip','from_addr','to_addr','critical and above level msg from xxx ') logging.info('blablabla...')
logging.error('notice please, an error happens when ...')
记录文件,需要有文件处理器(logging.FileHandler)。demo如下:
import logging
logger = logging.getLogger('file_logger')
logger.addHandler(logging.FileHandler('all.log'))
logger.info('some info...')
还需要其他的handler?参考这里。
配置型logger
是否已经厌倦了写代码的方式来自定义logger?好吧,它可以有更多的配置。可以参考这里。
三种方式:
1. 上面已经提到了
2. 通过fileConfig读取配置文件
以下来自官方demo
import logging
import logging.config logging.config.fileConfig('logging.conf') # create logger
logger = logging.getLogger('simpleExample') # 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
配置文件:
[loggers]
keys=root,simpleExample [handlers]
keys=consoleHandler [formatters]
keys=simpleFormatter [logger_root]
level=DEBUG
handlers=consoleHandler [logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0 [handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,) [formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
输出:
$ python simple_logging_config.py
2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
配置文件说明:
声明部分:
[loggers] keys = xxx,xxxx [handlers] keys = xxx,xxx [formatters] keys =xxx,xxx
赋值部分
logger赋值
[logger_xxx]
level = DEBUG/INFO/WARN/CRITICAL/ERROR
handlers = [handlers]里定义的handler
qualname = logger名
propagate = 1/0 #是否将log丢给上一级处理
handler赋值
[handler_xxx]
class = StreamHander/FileHander/handlers.SMTPHandler...
args = 传递给上面class的参数
level = DEBUG/INFO/WARN/CRITICAL/ERROR #是否处理,可以和logger的不同
formatter = [formatters]中定义的格式器
比较有用的一个handlers配置
[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
args=('xxx.log', 'a', 2000000, 9)#日志超过2000000 d的时候,重新另外生成一个文件,保存9天的记录
...
formatter赋值
[formatter_xxx]
format = %(var)s # var:asctime/name/levelname/message/ip/user/module/process/thread...
logging.config.fileConfig的特别说明:
disable_existing_loggers是一个可选参数,默认为True。它会阻止在fileConfig语句前面的logger的正常执行。其设计目的是为了反向兼容。
要使得所有的logger都有效,要么在配置文件中,将前面的logger给配置进去。
要么将它改为False。
3. 通过dictConfig读取配置dict
django 就使用了这种方式,配置dict如下:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'special': {
'()': 'project.logging.SpecialFilter',
'foo': 'bar',
}
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter': 'simple'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['special']
}
},
'loggers': {
'django': {
'handlers':['null'],
'propagate': True,
'level':'INFO',
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'myproject.custom': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['special']
}
}
}
转载请注明,本文来自Tommy.Yu的博客。谢谢!
python日志浅析的更多相关文章
- 浅析python日志重复输出问题
浅析python日志重复输出问题 问题起源: 在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日 ...
- Python日志输出——logging模块
Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...
- python日志模块logging
python日志模块logging 1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...
- python 日志打印之logging使用介绍
python 日志打印之logging使用介绍 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7 简单的将日志打印到屏幕 import logging lo ...
- python 日志的配置,python对日志封装成类,日志的调用
# python 日志的配置,python对日志封装成类,日志的调用 import logging # 使用logging模块: class CLog: # --------------------- ...
- python日志模块logging学习
介绍 Python本身带有logging模块,其默认支持直接输出到控制台(屏幕),或者通过配置输出到文件中.同时支持TCP.HTTP.GET/POST.SMTP.Socket等协议,将日志信息发送到网 ...
- Python 日志输出中添加上下文信息
Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...
- python日志模块笔记
前言 在应用中记录日志是程序开发的重要一环,也是调试的重要工具.但却很容易让人忽略.之前用flask写的一个服务就因为没有处理好日志的问题导致线上的错误难以察觉,修复错误的定位也很困难.最近恰好有时间 ...
- Python日志产生器
Python日志产生器 写在前面 有的时候,可能就是我们做实时数据收集的时候,会有一个头疼的问题就是,你会发现,你可能一下子,没有日志的数据源.所以,我们可以简单使用python脚本来实现产生实时的数 ...
随机推荐
- OpenGL教程
http://www.opengl-tutorial.org/ http://www.lighthouse3d.com/ http://www.arcsynthesis.org/gltut/ http ...
- 字体投影(test-shadow)与框架投影(box-shadow)
字体投影:text-shadow: 1px 1px 1px #ccc; 框架投影:box-shadow: 10px 10px 25px #ccc;
- Hiredis 基本使用
0. 前言 Hiredis是一个Redis的C客户端库函数,基本实现了Redis的协议的最小集.这里对hiredis的api作基本的介绍以及应用,主要参考hiredis的README文件以及相关源码. ...
- MIME类型(JSP中)
什么是MIME类型-在把输出结果传送到浏览器上的时候,浏览器必须启动是党的应用程序来处理这个输出文档.这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成.在HTTP中,MIME类型被定义在Co ...
- Python 线程、进程和协程
python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...
- MVC缓存OutPutCache学习笔记 (一) 参数配置
OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...
- git在windows命令行下使用
“不是内部或外部命令,也不是可运行的程序”,通常要将程序的exe路径配置环境变量. 将git的bin目录的路径添加到环境变量path中即可.
- 浅谈JavaScript中的继承
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...
- Owin是什么?
OWIN的英文全称是Open Web Interface for .NET. 如果仅从名称上解析,可以得出这样的信息:OWIN是针对.NET平台的开放Web接口. 那Web接口是谁和谁之间的接口呢?是 ...
- sqlserver2008 R2 创建作业(定时任务)
如题: 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 完成!!! 记得把服务打开.设置为自动启动,别重启服务器后没用了.