1.logging模块提供了四个组件
logger:日志类,有两个功能
1)配置日志的等级,处理器handler,过滤器filter
logger.setLevel(logging.INFO)
logger.addHandler(handler)
logger.addFilter(filter)
2)写日志
logger.info()

handler:处理器类,实际写日志的类
常用的处理器有StreamHandler和FileHandler
StreamHandler将日志输出到stream,如sys.stdout,sys.stderr
FileHandler将日志输出到文件
处理器类可以配置自己的等级,过滤器
一个logger可以配置多个处理器类

filter:过滤器类,过滤日志等级,内容
使用示例如下:
class InfoFilter(logging.Filter):
def filter(self,rec):
reurn rec.levelno==logging.INFO
logger.addFilter(InfoFilter())

formatter:内容格式化类,格式化输出的内容
格式化配置,使用%(<dict key>)s的形式,具体有哪些关键字,可以参照官网的介绍。
使用示例如下:
fmt='%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s'
formatter=logging.Formatter(fmt)
handler.setFormatter(formatter)

2.logger对象
使用logging.getLogger(name=None)函数找到一个logger对象,当name指定的logger不存在时,会自动创建一个该名称的对象,保存在logging.manage的loggerDict中。

3.logging日志输出流程

logger输出日志的流程:
1)用户代码调用打印日志函数(logging.info(),logging.debug()等)
2)若希望打印的日志级别不够,则流程停止。否则进入步骤3
3)建立一个LogRecord对象,该对象代表打印的日志
4)判断这条日志是否被filter过滤掉,如果被过滤,流程停止。否则进入步骤5
5)logger将LogRecord传递到它定义的handlers,进行处理
6)判断当前logger的propagate属性,为0,则流程停止,否则进入步骤7
7)判断当前logger有无父logger,如果没有,流程停止,否则设置当前logger为它的父logger,继续执行步骤5
注:logger对象是有继承关系的,如名为a.b,a.c的logger都是名为a的子logger,并且所有的logger对象都继承自root,如果子对象没有添加handler等配置,会从父对象继承,这样可以通过继承关系来复用配置。

handler处理日志的过程:
1)如果当前LogRecord的级别小于handler所设置的LogLevel,则停止流程,否则进入步骤2
2)判断当前LogRecord是否被handler设置的filter过滤,如果被过滤,流程停止,否则日志输出到最终目的地。

4.logging使用示例
logging有三种配置方式
1)代码定义logger,handler等

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import logging.config handler = logging.StreamHandler()
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' formatter = logging.Formatter(fmt) # 实例化formatter
handler.setFormatter(formatter) # 为handler添加formatter logger = logging.getLogger('tst') # 获取名为tst的logger
logger.addHandler(handler) # 为logger添加handler
logger.setLevel(logging.DEBUG) logger.info('first info message')
logger.debug('first debug message')

2)logging配置文件
loggin.conf采用了模式匹配的方式进行配置,正则表达式是r'^[(.*)]$',从而匹配出所有的组件。对于同一个组件具有多个实例的情况使用逗号‘,’进行分隔。对于一个实例的配置采用componentName_instanceName配置块。使用这种方式还是蛮简单的。
logging.conf

[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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
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')

3)logging配置字典

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import logging.config LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'test': {
'handlers': ['console'],
'level': 'ERROR',
},
},
}
logging.config.dictConfig(LOGGING)
logger = logging.getLogger('test')
logger.info('info message dict')
logger.warn('warn message dict')
logger.error('error message dict')
logger.critical('critical message dict')

python logging模块的更多相关文章

  1. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  2. python logging模块使用

    近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- import loggi ...

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

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

  4. (转)python logging模块

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

  5. Python logging 模块学习

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

  6. python logging—模块

    python logging模块 python logging提供了标准的日志接口,python logging日志分为5个等级: debug(), info(), warning(), error( ...

  7. Python logging模块无法正常输出日志

    废话少说,先上代码 File:logger.conf [formatters] keys=default [formatter_default] format=%(asctime)s - %(name ...

  8. 0x03 Python logging模块之Formatter格式

    目录 logging模块之Formatter格式 Formater对象 日志输出格式化字符串 LogRecoder对象 时间格式化字符串 logging模块之Formatter格式 在记录日志是,日志 ...

  9. 0x01 Python logging模块

    目录 Python logging 模块 前言 logging模块提供的特性 logging模块的设计过程 logger的继承 logger在逻辑上的继承结构 logging.basicConfig( ...

  10. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

随机推荐

  1. PKU 1005

    比较简单吧,其实算是数学问题了 // 1005.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdio.h ...

  2. Ubuntu 手工挂载硬盘

    首先我们得到到/dev/sda3这个分区的UUID,使用以下命令: sudo blkid /dev/sda3 结果如下: 然后,我们按照/etc/fstab文件中的格式添加一行如下内容: UUID=9 ...

  3. MySql使用游标Cursor循环(While)更新数据

    #要修改的变量 DECLARE var_ID VARCHAR(50) DEFAULT ''; #需要修改的数据的数量 DECLARE var_UpdateCount INT; #当前循环次数 DECL ...

  4. software_testing_work3_question2

    package com.Phantom; import java.rmi.server.Operation; import java.util.Scanner; public class Work3_ ...

  5. C#字符串截取

    .取前i个字符 ,i); string str1=str.Remove(i,str.Length-i); .去掉前i个字符 ,i); string str1=str.SubString(i); .从右 ...

  6. MSSQL—行转列

    行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...

  7. Chrome和IE中使用window.open函数

    做前端开发的人员经常回遇到使用windows.open这个函数来打开一个新的网页窗口,使用这个函数的时候有些需要注意的地方,在Chrome和IE下该函数还是有一些细节性的区别. 以下是我在项目中使用的 ...

  8. CoInitialize浅析二

    最近工作比较忙,在粗略分析了CoInitialize之后我们一直没有再深入研究,下面言归正传.前面我们初步了解到了CoInitialize其实是通过调用CoInitializeEx来实现功能的,而后者 ...

  9. 内存的crash记录分析

    服务器上线之后,发生了3次crash,感觉是一次比较典型的内存bug的排错经历,所以特地记录下来供以后借鉴.下面描述一下3次crash时候的coredump的当前堆栈信息. 第一次crash的core ...

  10. PHP生成唯一会员卡号

    我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35.这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 ...