原文:http://www.cnblogs.com/dahu-daqing/p/7040764.htmlhtml
logging模块是Python内置的标准模块,主要用于输出运行日志,能够设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具有以下优势:python
能够经过设置不一样的日志等级,在release版本中只输出重要信息,而没必要显示大量的调试信息;web
print将全部信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则能够由开发者决定将信息输出到什么地方,以及怎么输出;函数
不少程序都有记录日志的需求,而且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你能够经过它存储各类格式的日志,工具
logging的日志能够分为 debug(), info(), warning(), error() and critical()
5个级别,下面咱们看一下怎么用。post
默认级别是WARNING,表示只有WARING和比WARNING更严重的事件才会被记录到日志内,低级别的信息会被忽略。
所以,默认状况下,DEBUG和INFO会被忽略,WARING、ERROR和CRITICAL会被记录。
有多种方法用来处理被跟踪的事件。最简单的方法就是把它们打印到终端控制台上。或者将它们写入一个磁盘文件内。
import logging logging.warning('Watch out!') # 消息会被打印到控制台上 logging.info('I told you so') # 这行不会被打印,由于级别低于默认级别warning
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)
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')
#引入日志模块
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")
简洁的方法:输出到文件的简单方法ui
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 loggingthis
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'
)url
def sayhi():
logging.error('from sayhi...')spa
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')
日志的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条件的过滤掉
logger.debug("test ....") logger.info("test info ....") logger.warning("start to run db backup job ....") logger.error("test error ....")
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....