作用:记录程序运行中的日志
logging的日志可以分为 debug(), info(), warning(), error() and critical()
5个级别
简单的打印到屏幕
import logging logging.warning("user [alex] attempted wrong password more than 3 times") logging.critical("server is down")
>>>WARNING:root:user [alex] attempted wrong password more than 3 times
>>>
CRITICAL:root:server is down
写入到文件
import logging logging.basicConfig(filename=‘example.log‘,level=logging.INFO) #level设置级别,只显示所设置的级别,以及更高的级别 logging.debug(‘This message should go to the log file‘) logging.info(‘So should this‘) logging.warning(‘And this, too‘)
自定义日志格式
mport logging logging.basicConfig(format=‘%(asctime)s %(message)s‘, datefmt=‘%m/%d/%Y %I:%M:%S %p‘) logging.warning(‘is when this event was logged.‘) #输出 12/12/2010 11:46:36 AM is when this event was logged.
支持的日志格式:
高级用法
同时输出到屏幕以及文件
创建logger
每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
logger=logging.getLogger(”chat.gui”)
logger1=logging.getLogger(”chat.kernel”)
绑定handler
handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Handler可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
常用的handler:
logging.handlers.RotatingFileHandler
这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的函数是:
import logging import logging.handlers RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
其中filename和mode两个参数和FileHandler一样。
这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的函数是:
import logging import logging.handlers TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
th = TimedRotatingFileHandler(os.path.join(BASE_DIR, ‘doc‘, ‘flow.log‘), when="D",interval=30)
其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
interval
是时间间隔。
when
参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
添加formatter组件
支持的格式见上表
fh = logging.FileHandler("access.log") formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) fh.setFormatter(formatter) #把formmater绑定到fh上
添加filter组件
日志的formatter是个独立的组件,可以跟handler组合
fh = logging.FileHandler("access.log")
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
fh.setFormatter(formatter) #把formmater绑定到fh上
如果你想对日志内容进行过滤,就可自定义一个filter
class IgnoreBackupLogFilter(logging.Filter):
"""忽略带db backup 的日志"""
def filter(self, record): #固定写法
return "db backup" not in record.getMessage()
注意filter函数会返加True or False,logger根据此值决定是否输出此日志
然后把这个filter添加到logger中
logger.addFilter(IgnoreBackupLogFilter())
下面的日志就会把符合filter条件的过滤掉
logger.debug("test ....")
logger.info("test info ....")
logger.warning("start to run db backup job ....")
logger.error("test error ....")
一个同时输出到屏幕、文件、带filter的完成例子
import logging
class IgnoreBackupLogFilter(logging.Filter):
"""忽略带db backup 的日志"""
def filter(self, record): #固定写法
return "db backup" not in record.getMessage()
#console handler
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
#file handler
fh = logging.FileHandler(‘mysql.log‘)
#fh.setLevel(logging.WARNING)
#formatter
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
#bind formatter to ch
ch.setFormatter(formatter)
fh.setFormatter(formatter)
logger = logging.getLogger("Mysql")
logger.setLevel(logging.DEBUG) #logger 优先级高于其它输出途径的
#add handler to logger instance
logger.addHandler(ch)
logger.addHandler(fh)
#add filter
logger.addFilter(IgnoreBackupLogFilter())
logger.debug("test ....")
logger.info("test info ....")
logger.warning("start to run db backup job ....")
logger.error("test error ....")
文件自动截断例子
import logging
from logging import handlers
logger = logging.getLogger(__name__)
log_file = "timelog.log"
#fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3)
fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)
formatter = logging.Formatter(‘%(asctime)s %(module)s:%(lineno)d %(message)s‘)
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.warning("test1")
logger.warning("test12")
logger.warning("test13")
logger.warning("test14")
logging.handlers.RotatingFileHandler
原文:https://www.cnblogs.com/leiyiming/p/9085476.html