原文: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. benthos 通过rest api 配置 stream 说明

    stream 模式,我们可以通过rest api 进行控制 使用方法 启动 benthos --streams 进行流的配置(rest api) curl http://localhost:4195/ ...

  2. PHP开源的项目管理软件

    禅道 http://devel.zentao.net/help-book-zentaophphelp.html PHP session详讲 http://blog.163.com/lgh_2002/b ...

  3. 监控Linux的Steps&Q&A

    spolight的下载地址:https://www.quest.com/spotlight-on-windows/ 问题1.sar -u 之后,只有一条记录.这种情况执行一下:sudo sar -d; ...

  4. FastAdmin 自己做的插件 SQL 有一个表没有生成成功

    群里有群友问: 给插件建的install.sql 里有三个表,为啥会出现安装成功后没有错误提示,只生成了两个表的情况..这可能会是什么...原因 第一感觉和 FastAdmin 没有关系. 没生成表, ...

  5. windows server 2008 R2 无法启用"网络发现" 需要启动的服务

    必须打开以下服务: 1.dnscache(简写.fdrespub(简写) 2.SSDP Discovery 3. UPnP Device Host 4. Computer Browser 5.Serv ...

  6. js 取整

    1.丢弃小数部分,保留整数部分 js:parseInt(7/2)  2.向上取整,有小数就整数部分加1  js: Math.ceil(7/2)  3,四舍五入.  js: Math.round(7/2 ...

  7. 在ASP.NET应用程序中使用身份模拟(Impersonation)

    摘要   缺省情况下,ASP.NET应用程序以本机的ASPNET帐号运行,该帐号属于普通用户组,权限受到一定的限制,以保障ASP.NET应用程序运行的安全.但是有时需要某个ASP.NET应用程序或者程 ...

  8. css-深入理解margin和padding

    最近一阶段从新学习了css,发现真的有很多很多的地方都是空白的,今天我们来总结一下margin和padding的一些不为人知的秘密! 一利用float和margin实现布局 我们首先来实现一个两列示布 ...

  9. LwIP下一种可能耗尽内存的情况

    若App在连接断开后仍旧使用该tcp_pcb发送数据,LwIP会自动发送SYNC试图重建连接.若对方不响应(指没有任何响应)而App又在不断发送数据,将导致LwIP不停的发送新的SYNC(每试图发送一 ...

  10. 数据库启动失败:The server quit without updating PID file

    1.可能是/usr/local/mysql/data/mysql.pid文件没有写的权限解决方法 :给予权限,执行 “chown -R mysql:mysql /var/data” “chmod -R ...