原文: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....



13 python logging模块的更多相关文章

  1. (转)python logging模块

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

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

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

  3. python logging模块使用

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

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

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

  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( ...

随机推荐

  1. Oracle:Decode在时间范围中的使用

    做查询的时候需要下一个sql,需要select test_time出来,如果test_Time的HH24:Mi:SS在7:00:00和19:00:00返回白班,否则返回夜班 select case w ...

  2. .NET基金会成立

    作者 Jonathan Allen ,译者 臧秀涛 发布于 2014年4月8日 随着.NET基金会的成立,微软在成为主要的开源参与者的道路上又前进了一步.该基金会的宗旨是“成为越来越多的开源.NET项 ...

  3. 推荐10款优秀的JavaScript Web UI库 框架和套件

    在进行Web开发时,并非所有的库都适合你的项目,但真正开发的时候,你任然需要依赖一款UI框架.特别在你时间紧迫的时候,它是你忠实的朋友. 他们都是些广泛使用包含不同语言实现的WEB UI框架.今天我就 ...

  4. chrome 小技巧:保持元素的hover状态

    审查元素,选中需要hover的标签 点击"Styles"菜单中的":hov",弹出 Force element state 选中相应的 :hover :acti ...

  5. Redis的多线程

    Redis是单线程内部机制,那么怎么实现并发?在单机上部署多个Redis实例.

  6. JSOI2008——星球大战

    题目:https://www.luogu.org/problemnew/show/1197 并查集. 难点是若依次去掉点在求连通块个数,时间太长. 精妙的思维:先全部读入,再逆向求连通块个数——增加点 ...

  7. tyvj1391走廊泼水节

    题目:http://www.joyoi.cn/problem/tyvj-1391 考虑对于每一条边,新加的长度是(左边点数*右边点数-1)*(当前边权+1): 然后要kruskal的思想,把边从小到大 ...

  8. nginx反向代理解决跨域问题

    跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 下表格为前后端分离的域名,技术信息:   域名 服务器 使用技术 前端 http://b.yynf.com ...

  9. 将DataTable 覆盖到 SQL某表(包括表结构及所有数据)

    调用代码: string tableName = "Sheet1"; openFileDlg.ShowDialog(); DataTable dt = GeneralFun.Fil ...

  10. 【ActiveMQ入门-5】ActiveMQ学习-Queue与Topic的比较

    Queue与Topic的比较 1.JMS Queue执行load balancer语义: 一条消息仅能被一个consumer收到. 如果在message发送的时候没有可用的consumer,那么它将被 ...