原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html

1 logging模块简介

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;

print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,

logging的日志可以分为 debug(), info(), warning(), error() and critical()5个级别,下面我们看一下怎么用。

默认级别是WARNING,表示只有WARING和比WARNING更严重的事件才会被记录到日志内,低级别的信息会被忽略。

因此,默认情况下,DEBUG和INFO会被忽略,WARING、ERROR和CRITICAL会被记录。

有多种方法用来处理被跟踪的事件。最简单的方法就是把它们打印到终端控制台上。或者将它们写入一个磁盘文件内。
import logging

logging.warning('Watch out!')  # 消息会被打印到控制台上
logging.info('I told you so') # 这行不会被打印,因为级别低于默认级别warning

2 logging模块使用

2.1 配置logging基本的设置,记录到文件里

import logging

logging.basicConfig(filename='example.log',level=logging.INFO)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
其中下面这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,
在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。 logging.basicConfig(filename='example.log',level=logging.INFO)

2.2python logging模块 basicConfig配置文件

logging.basicConfig(level=log_level,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='parser_result.log',
filemode='w')#默认为a
logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略 logging打印信息函数: logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

2.2把日志同时输出至文件和控制台

#引入日志模块
import logging #1 生成 logger 对象
logger_user = logging.getLogger('atm_user') #每个程序在输出信息之前都要获得一个Logger。
# Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
#LOG=logging.getLogger(”chat.gui”) # 2 logger.setLevel()指定日志最低级别
logger_user.setLevel(level = logging.DEBUG) # 3 FileHandler()日志输出至文件
handler_user = logging.FileHandler('test.log',encoding='utf-8') # handler对象负责发送相关的信息到指定目的地
# 4 指定被处理的信息最低级别 Handler.setLevel()
handler_user.setLevel(logging.DEBUG) # 5 给这个输出设定一个格式
formatter = logging.Formatter('%(asctime)s--%(name)s--%(levelname)s--%(message)s')
handler_user.setFormatter(formatter) # 6 增加指定的文件
logger_user.addHandler(handler_user) # StreamHandler()输出至屏幕
console = logging.StreamHandler()
console.setLevel(logging.INFO) # 增加指定的文件 Handler()
logger_user.addHandler(handler_user)
#或者控制台 Handler()
logger_user.addHandler(console)
#------------------------------------------------
logger_user.info("Start print log")
logger_user.debug("Do something")
logger_user.warning("Something maybe fail.")
logger_user.info("Finish")

简洁的方法:输出到文件的简单方法

import logging
logging.basicConfig(level = logging.INFO,
format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='test2.log', ) logger_user = logging.getLogger('user') logger_user.info("Start print log")
logger_user.debug("Do something")
logger_user.warning("Something maybe fail.")
logger_user.info("Finish") #-----------------------------------------------------------------------

# 函数
import logging

logging.basicConfig(filename='log_test.log',
level=logging.WARNING,
format='%(asctime)s:%(levelname)s:%(filename)s:%(module)s %(message)s',
datefmt='%Y-%m-%d %I:%M:%S %p'
)

def sayhi():
logging.error('from sayhi...')

sayhi()

logging.debug('so should this')
logging.info('I told you so')
logging.warning('Watch out!')
logging.error('this error is no')
logging.critical('critical xxxx')

2.3、formatter组件

日志的formatter是个独立的组件,可以跟handler组合

fh = logging.FileHandler("access.log")#添加日志到文件
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) #把formmater绑定到fh上

2.4、filter组件

如果你想对日志内容进行过滤,就可自定义一个filter

class IgnoreBackupLogFilter(logging.Filter):

    """忽略带db backup 的日志"""
    def filter(self, record): #固定写法
        return   "db backup" not in record.getMessage()

下面的日志就会把符合filter条件的过滤掉

logger.debug("test ....")
logger.info("test info ....")
logger.warning("start to run db backup job ....")
logger.error("test error ....")

2.5一个同时输出到屏幕、文件、带filter的完成例子

import logging

# filter 过滤
class IgnoreBackupLogFilter(logging.Filter):
"""忽略带db backup 的日志"""
def filter(self, record): #固定写法
return "db backup" not in record.getMessage() # 1.生成logging对象
logger = logging.getLogger('web')
logger.setLevel(logging.INFO) # 设置日志等级
# 1.1 把filter对象添加到logger中
logger.addFilter(IgnoreBackupLogFilter()) # 2。生成hander对象
ch = logging.StreamHandler() # 终端打印
ch.setLevel(logging.DEBUG) # 终端打印 日志等级
fh = logging.FileHandler('web.log') # 文件保存
fh.setLevel(logging.WARNING) # 文件保存 日志等级 # 2.1把hander对象绑定到logger
logger.addHandler(ch)
logger.addHandler(fh) # 3.生成formatter 对象
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 3.1把formatter对象绑定到hander对象
ch.setFormatter(console_formatter)
fh.setFormatter(file_formatter) logger.debug("test ....")
logger.info("test info ....")
logger.warning("start to run db backup job ....")
logger.warning("start to run db backup job 1....")
logger.warning("start to run db backup job 2....")
logger.error("test error ....")
#-----------------------------------------------------------------------
保存输出,非过滤条件下的数据
web.log 文件: 2018-08-31 14:23:55,694 - web - ERROR - test error ....
控制台输出:

2018-08-31 14:23:55,692 - web - INFO - test info ....
2018-08-31 14:23:55,694 - web - ERROR - test error ....

如果条件变为:保存输出满足过滤条件的数据
return "db backup" in record.getMessage()
wed.log文件:
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job ....
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 1....
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 2.... 控制台:

2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job ....
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 1....
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 2....



最新文章

  1. error LNK2019:unresolved external symbol
  2. zookeeper 应用
  3. IEnumerable<T>与IQueryable<T>以及.net的扩展方法
  4. c++指针与引用问题
  5. 查看Windows服务器登录日志
  6. bootstrap字体图标在谷歌显示正常,在火狐显示异常的问题
  7. BF算法(朴素的模式匹配算法)
  8. js架构设计模式——MVVM模式下,ViewModel和View,Model有什么区别
  9. Redis系列三(redis配置文件分析)
  10. hdu 2196 Computer(树形DP经典)
  11. bzoj 5297: [Cqoi2018]社交网络
  12. erMaster插件
  13. Java进阶篇设计模式之五-----外观模式和装饰器模式
  14. DS控件库 Win7链接列表框效果1:右侧箭头
  15. linux 安装中文字体
  16. 基于C#的Appium自动化测试框架(Ⅰ):程序结构
  17. [译]使用mediatR的notification来扩展的的应用
  18. zookeeper做集群后启动不了,大部分原因是防火墙未关闭
  19. hdu 3371 Connect the Cities(最小生成树)
  20. STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)

热门文章

  1. search bar 创建的一些文章
  2. bzoj 3528 [ZJOI2014] 星系调查 题解
  3. Array对象(prototype)
  4. Linux下安装xampp和bugfree
  5. 使用Apriori进行关联分析(一)
  6. tomcat源码阅读之单点登录
  7. Entity创建一对一关系
  8. JWT 基础教程
  9. ios之mknetworkkit笔记
  10. android 获取当前 activity