python中logging包的使用总结


Posted in Python onFebruary 28, 2018

1.logging 简介

Python的logging package提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。

logging包中定义了Logger、Formatter、Handler和Filter等重要的类,除此之外还有config模块。

Logger是日志对象,直接提供日志记录操作的接口

Formatter定义日志的记录格式及内容

Handler定义日志写入的目的地,你可以把日志保存成本地文件,也可以每个小时写一个日志文件,还可以把日志通过socket传到别的机器上。python提供了十几种实用handler,比较常用的有StreamHandler,BaseRotatingHandler,SocketHandler,DatagramHandler,SMTPHandler等。我们可以通过Logger对象的addHandler()方法,将log输出到多个目的地。

2.Logging package

在python编程中,引入了Logging package,那么可以存在一个名称为root的Logging对象,以及很多其他名称的Logging对象。不同的Logger对象的Handler,Formatter等是分开设置的。

(1)logging.getLogger() 如果getLogging中不带参数,那么返回的是名称为root的Logger对象,如果带参数,那么就以该参数为名称的Logger对象。同名称的Logger对象是一样的。

(2)logging.basicConfig() 此方法是为名称为root的Logger对象进行配置。

(3)logging.info() logging.debug()等,使用的root Logger对象进行信息输出。如果是用其他的Logging对象进行log输出,可以使用Logging.getLogger(name).info()来实现。

(4)日志的等级

CRITICAL = 50 
ERROR = 40 
WARNING = 30 
INFO = 20 
DEBUG = 10 
NOTSET = 0

在python中有0,10,20,30,40,50这6个等级数值,这6个等级数值分别对应了一个字符串常量,作为等级名称,如上。但是可以通过logging.addLevelName(20, "NOTICE:")这个方法来改变这个映射关系,来定制化日志等级名称。

通过Logger对象的setLevel()方法,可以配置Logging对象的默认日志等级,只有当一条日志的等级大于等于这个默认的等级,才会输出到log文件中。

当使用logging.info(msg)输出log时,内部封装会用数字20作为日志等级数值,默认情况下20对应的是INFO,但如果通过addLevelName()修改了20对应的等级名称,那么log中打印的就将是个性化的等级名称。

3.logging包使用配置文件

在1~2中描述的,对一个Logger对象的Handler,Formatter等都是在程序中定义或绑定的。而实际上Logging的个性化的配置可以放到配置文件中。

logging的配置文件举例如下:

[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 
datefmt=

对应程序为:

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

4.一个常用的Logging封装工具

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 
#coding=utf-8 
 
import logging 
import os 
 
class Logger(object): 
  """ 
  封装好的Logger工具 
  """ 
 
  def __init__(self, logPath): 
    """ 
    initial 
    """ 
    log_path = logPath 
    logging.addLevelName(20, "NOTICE:") 
    logging.addLevelName(30, "WARNING:") 
    logging.addLevelName(40, "FATAL:") 
    logging.addLevelName(50, "FATAL:") 
    logging.basicConfig(level=logging.DEBUG, 
        format="%(levelname)s %(asctime)s [pid:%(process)s] %(filename)s %(message)s", 
        datefmt="%Y-%m-%d %H:%M:%S", 
        filename=log_path, 
        filemode="a") 
    console = logging.StreamHandler() 
    console.setLevel(logging.DEBUG) 
    formatter = logging.Formatter("%(levelname)s [pid:%(process)s] %(message)s") 
    console.setFormatter(formatter) 
    logging.getLogger("").addHandler(console) 
 
  def debug(self, msg=""): 
    """ 
    output DEBUG level LOG 
    """ 
    logging.debug(str(msg)) 
 
  def info(self, msg=""): 
    """ 
    output INFO level LOG 
    """ 
    logging.info(str(msg)) 
 
  def warning(self, msg=""): 
    """ 
    output WARN level LOG 
    """ 
    logging.warning(str(msg)) 
 
  def exception(self, msg=""): 
    """ 
    output Exception stack LOG 
    """ 
    logging.exception(str(msg)) 
 
  def error(self, msg=""): 
    """ 
    output ERROR level LOG 
    """ 
    logging.error(str(msg)) 
 
  def critical(self, msg=""): 
    """ 
    output FATAL level LOG 
    """ 
    logging.critical(str(msg)) 
   
 
if __name__ == "__main__": 
  testlog = Logger("oupput.log") 
  testlog.info("info....") 
  testlog.warning("warning....") 
  testlog.critical("critical....") 
  try: 
    lists = [] 
    print lists[1] 
  except Exception as ex: 
    """logging.exception()输出格式: 
    FATAL: [pid:7776] execute task failed. the exception as follows: 
    Traceback (most recent call last): 
      File "logtool.py", line 86, in <module> 
        print lists[1] 
    IndexError: list index out of range 
    """ 
    testlog.exception("execute task failed. the exception as follows:") 
    testlog.info("++++++++++++++++++++++++++++++++++++++++++++++") 
    """logging.error()输出格式: 
    FATAL: [pid:7776] execute task failed. the exception as follows: 
    """ 
    testlog.error("execute task failed. the exception as follows:") 
    exit(1)

备注:exception()方法能够完整的打印异常的堆栈信息。error()方法只会打印参数传入的信息。

备注:

按照官方文档的介绍,logging 是线程安全的,也就是说,在一个进程内的多个线程同时往同一个文件写日志是安全的。但是多个进程往同一个文件写日志是不安全的。

Python 相关文章推荐
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
Python地图绘制实操详解
Mar 04 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
python获取地震信息 微信实时推送
Jun 18 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
Autopep8的使用(python自动编排工具)
Mar 02 Python
Pytorch中的数据集划分&正则化方法
May 27 Python
深入理解Python爬虫代理池服务
Feb 28 #Python
python实现装饰器、描述符
Feb 28 #Python
python安装教程
Feb 28 #Python
深入理解Python 关于supper 的 用法和原理
Feb 28 #Python
TensorFlow实现RNN循环神经网络
Feb 28 #Python
python使用TensorFlow进行图像处理的方法
Feb 28 #Python
使用Python搭建虚拟环境的配置方法
Feb 28 #Python
You might like
php MYSQL 数据备份类
2009/06/19 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
获取body标签的两种方法
2011/10/13 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
React如何避免重渲染
2018/04/10 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
Python的函数的一些高阶特性
2015/04/27 Python
python之Socket网络编程详解
2016/09/29 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
Python读写zip压缩文件的方法
2018/08/29 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
Python实现FTP文件传输的实例
2019/07/07 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
Python排序函数的使用方法详解
2020/12/11 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
新闻编辑自荐书范文
2014/02/12 职场文书
厂区绿化方案
2014/05/08 职场文书
出纳岗位职责范本
2015/03/31 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python