最近想把自己零零散散写的代码嵌成一个应用,要考虑到各方面的debug,把logging看了一下,把用到的记下来。

  • 将日志打印到屏幕
import logging

logging.debug(u'调试')
logging.info(u'运行')
logging.warning(u'警告') #运行显示:
#WARNING:root:警告
#默认情况下,logging打印WARNING级别以上的,并打印到屏幕。
#日志级别大小关系 CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET(默认),并且可以自定义。
  • basicConfig函数配置日志输出
#-*- coding:utf-8 -*-
import logging
logging.basicConfig(level=logging.DEBUG,
format=u'%(asctime)s 文件:%(filename)s [第 %(lineno)d 行] 等级: %(levelname)s 信息: %(message)s',
datefmt=' %Y %b %d %H:%M:%S,%a',
filename='guapeng.log',
filemode='w') logging.debug(u'调试')
logging.info(u'信息')
logging.warning(u'警告') #guapeng.log文件显示如下
#2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 10 行] 等级: DEBUG 信息: 调试
#2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 11 行] 等级: INFO 信息: 信息
#2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 12 行] 等级: WARNING 信息: 警告 #basicConfig参数说明: #filename: 指定日志文件名 #filemode: 打开模式,'w'或'a' #format: 指定输出的格式和内容,一些format默认的参数: #  %(levelno)s: 日志级别数值
#  %(levelname)s: 日志级别名称
#  %(pathname)s: 当前执行程序的路径,相当于sys.argv[0]
#  %(filename)s: 当前执行程序名(注意这里与log文件名是不同的)
#  %(funcName)s: 当前执行函数
#  %(lineno)d: 当前行号
#  %(asctime)s: 当前时间
#  %(thread)d: 线程ID
#  %(threadName)s: 线程名称
#  %(process)d: 进程ID
#  %(message)s: 日志信息
#datefmt: 指定时间格式,与time.strftime()一样
#level: 设置打印日志级别,默认为logging.WARNING,上例为DEBUG,故大于DEBUG的都输出到log文件。 #stream: 指定日志的输出方式,默认输出到sys.stderr(屏幕),当stream和filename同时指定时,stream被忽略
  • 将debug信息打印打log文件,将info信息打印到屏幕
#-*- coding:utf-8 -*-
import logging
logging.basicConfig(level=logging.DEBUG,
format=u'%(asctime)s 文件:%(filename)s [第 %(lineno)d 行] 等级: %(levelname)s 信息: %(message)s',
datefmt=' %Y %b %d %H:%M:%S,%a',
filename='guapeng.log',
filemode='w')
#定义一个StreamHandler,将INFO级别的信息打印到屏幕
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
log = logging.getLogger('').addHandler(console) logging.debug(u'调试')
logging.info(u'信息')
logging.warning(u'警告') #guapeng.log文件显示如下
#2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 10 行] 等级: DEBUG 信息: 调试
#2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 11 行] 等级: INFO 信息: 信息
#2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 12 行] 等级: WARNING 信息: 警告 #屏幕显示如下
#root : INFO 信息
#root : WARNING 警告
  • 用config文件,同时实现日志文件按天存储,而且只存一周内的日志。

python代码

#-*- coding:utf-8 -*-
import logging
import logging.config #导入配置文件
logging.config.fileConfig("logging.conf") #创建logger
loggerInfo = logging.getLogger("TimeInfoLogger") #测试代码
loggerInfo.debug("debug message")
loggerInfo.info("info message")
loggerInfo.warn("warn message")
loggerInfo.error("error message")
loggerInfo.critical("critical message")

logging.conf文件代码

# 定义logger模块,root是父类,必需存在的,其它类自行定义。
[loggers]
keys=root,TimeInfoLogger # 定义handler
[handlers]
keys=TimeInfoHandler #定义输出格式
[formatters]
keys=TimeInfoFmt #--------------------------------------------------
# 实现上面定义的logger模块,必需是[logger_xxxx]这样的形式
#--------------------------------------------------
# [logger_xxxx] logger_模块名称
# level 级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL
# handlers 处理类,可以有多个,用逗号分开
# qualname logger名称,应用程序通过 logging.getLogger获取。对于不能获取的名称,则记录到root模块。
# propagate 是否继承父类的log信息,0:否 1:是
[logger_root]
level=INFO
handlers=TimeInfoHandler [logger_TimeInfoLogger]
level=INFO
handlers=TimeInfoHandler
propagate=0
qualname=TimeInfoLogger #--------------------------------------------------
# handler
#--------------------------------------------------
# [handler_xxxx]
# class handler类名
# level 日志级别
# formatter,上面定义的formatter
# args handler初始化函数参数
[handler_TimeInfoHandler]
class=logging.handlers.TimedRotatingFileHandler
level=INFO
formatter=TimeInfoFmt
args=('C:\\Users\\tyanf\\Desktop\\error.log', 'midnight', 1, 6) #--------------------------------------------------
# 日志格式
#--------------------------------------------------
# %(asctime)s 年-月-日 时-分-秒,毫秒 2013-04-26 20:10:43,745
# %(filename)s 文件名,不含目录
# %(pathname)s 目录名,完整路径
# %(funcName)s 函数名
# %(levelname)s 级别名
# %(lineno)d 行号
# %(module)s 模块名
# %(message)s 消息体
# %(name)s 日志模块名
# %(process)d 进程id
# %(processName)s 进程名
# %(thread)d 线程id
# %(threadName)s 线程名
[formatter_TimeInfoFmt]
format=%(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter
#测试时间从7月20日到7月27号,最后文件库显示如下:
#error.log.2015-07-21
#error.log.2015-07-22
#error.log.2015-07-23
#error.log.2015-07-24
#error.log.2015-07-25
#error.log.2015-07-26
#error.log
#其中error.log.2015-07-20由于程序设定backupcount为6,当大于6时把最早的删除,再添加新的日志文件,故已经被删除。

参考资料:

http://my.oschina.net/leejun2005/blog/126713

https://docs.python.org/2/library/logging.handlers.html

记录一下自己用到的python logging的更多相关文章

  1. Python LOGGING使用方法

    Python LOGGING使用方法 1. 简介 使用场景 场景 适合使用的方法 在终端输出程序或脚本的使用方法 print 报告一个事件的发生(例如状态的修改) logging.info()或log ...

  2. python Logging的使用

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息, ...

  3. Python logging 模块和使用经验

    记录下常用的一些东西,每次用总是查文档有点小麻烦. py2.7 日志应该是生产应用的重要生命线,谁都不应该掉以轻心 有益原则 级别分离 日志系统通常有下面几种级别,看情况是使用 FATAL - 导致程 ...

  4. python logging模块使用流程

    #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') logging ...

  5. python logging详解及自动添加上下文信息

    之前写过一篇文章日志的艺术(The art of logging),提到了输出日志的时候记录上下文信息的重要性,我认为上下文信息包括: when:log事件发生的时间 where:log事件发生在哪个 ...

  6. 读懂掌握 Python logging 模块源码 (附带一些 example)

    搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. 整个 ...

  7. (转)python logging模块

    python logging模块 原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python ...

  8. Python logging 模块学习

    logging example Level When it's used Numeric value DEBUG Detailed information, typically of interest ...

  9. python logging 模块的应用

    对一名开发者来说最糟糕的情况,莫过于要弄清楚一个不熟悉的应用为何不工作.有时候,你甚至不知道系统运行,是否跟原始设计一致. 在线运行的应用就是黑盒子,需要被跟踪监控.最简单也最重要的方式就是记录日志. ...

随机推荐

  1. LFS,编译自己的Linux系统 - 准备

    概述 现在用的操作系统是Win8.1,用VMware创建一个虚拟机,3G内存(物理内存是6G,分一半),23G硬盘,其中3G用于swap分区,10G用于host system,10G用于建立LFS系统 ...

  2. 70道android面试题汇总

    1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在 ...

  3. 树上战争(HDU 2545 并查集求解点到根节点长度)

    树上战争 Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. Java 学习 第五篇;面向对象

    1:基本数据类型的拆装: 基本变量类型 通过 new WrapperClass(primitive) 创建包装类对象: 包装类的对象 通过 WrapperInstance.XXXValue() 获取包 ...

  5. QSizePolicy可均匀调整控件的大小,还可设置比例,非常完美(每个QWidget都有这个功能)

    http://blog.csdn.net/liang19890820/article/details/51986284 它是QWidget的固有属性: http://doc.qt.io/qt-4.8/ ...

  6. 关于ArcGIS Rest API

    ArcGIS Rest API: 9.3版本: http://resources.esri.com/help/9.3/arcgisserver/apis/rest/index.html 10版本:ht ...

  7. pragma pack(非常有用的字节对齐用法说明)

    强调一点: #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(wor ...

  8. UVA_Rotation Game<旋转游戏> UVA 1343

    The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The ...

  9. python刷取CSDN博文访问量之一

    python刷取CSDN博文访问量之一 作者:vpoet 注:这个系列我只贴代码,代码不注释.有兴趣的自己读读就懂了,纯属娱乐,望管理员抬手 若有转载一定不要注明来源   #coding=utf-8 ...

  10. 微信iOS WKWebview 网页开发适配指南

    微信iOS客户端将于2017年3月1日前逐步升级为WKWebview内核,需要网页开发者提前做好网站的兼容检查和适配. 背景 WKWebView 是苹果在iOS 8中引入的新组件,目的是提供一个现代的 ...