1、logging模块使用场景
在写程序的时候,尤其是大型的程序,在程序中加入日志系统是必不可少的,它能记录很多的信息。刚刚接触python的时候肯定都在用print来输出信息,这样是最简单的输出,正是因为这样,在调试的时候还要去逐个的去更新print后面的内容,代码少的时候还好,但是当代码量到达一定数量时,使用logging就是一种好的选择
2、loggging对应日志的级别
# coding:utf-8 import logging logging.debug("test debug") logging.info("test info") logging.warning("test warning") logging.error("test error") logging.critical("test critical")
回显信息:
结果说明:
默认生成的日志root logger的level是logging.WARNING,低于该级别的就不输出了
日志级别优先级:CRITICAL > ERROR > WARNING > INFO > DEBUG
debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作
error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
如何需要展低于waring级别下的日志信息:则需要设置NOTSET级别来显示
import logging logging.basicConfig(level=logging.NOTSET) logging.debug("test debug")
回显信息:
3、常见方法和参数说明
logging.Formatter():这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。
Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:
1. 为程序提供记录日志的接口
2. 判断日志所处级别,并判断是否要过滤
3. 根据其日志级别将该条日志分发给不同handler
常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter,过滤作用
Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。
常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter
4、日志输出---控制台
import logging # 引入logging模块 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') # logging.basicConfig函数对日志的输出格式及方式做相关配置 # 由于日志基本配置中级别设置为DEBUG,所以一下打印信息将会全部显示在控制台上 logging.info('loggging info message') logging.debug('loggging debug message') logging.warning('loggging a warning message') logging.error('loggging error message') logging.critical('loggging critical message')
5、日志输出--日志文件和控制台
1、初始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字
2、设置级别 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志
3、设置Filehandler和StreamHandler来把日志记录到文件里,同时设置记录文件的日志级别和控制台打印日志的文件级别--Handler,常用的是StreamHandler和FileHandler,windows下你可以简单理解为一个是console和文件日志,一个打印在CMD窗口上,一个记录在一个文件上
4、设置日志格式
--------------------------------------------------------------------
及常见日志格式说明:
%(name)s Logger的名字
%(levelname)s 文本形式的日志级别
%(message)s 用户输出的消息
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(levelno)s 数字形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
# getLogger()方法后面加上所要日志记录的模块名字 logger = logging.getLogger("Y_Test") logger.setLevel(logging.DEBUG) # 建立一个filehandler来把日志记录在文件里,级别为debug以上 fh = logging.FileHandler("spam.log") fh.setLevel(logging.DEBUG) # 建立一个streamhandler来把日志打在CMD窗口上,级别为error以上 ch = logging.StreamHandler() ch.setLevel(logging.ERROR) # 设置日志格式 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch.setFormatter(formatter) fh.setFormatter(formatter) # 将相应的handler添加在logger对象中 logger.addHandler(ch) logger.addHandler(fh) # 开始打日志 logger.debug("debug message") logger.info("info message") logger.warn("warn message") logger.error("error message") logger.critical("critical message")
6、当一个项目比较大的时候,不同的文件中都要用到Log,可以考虑将其封装为一个类来使用
# coding:utf-8 import logging __author__ = 'YangJun' # 普通logging控制台输出和文件日志输出格式及调用 # logger = logging.getLogger('Clarence') # logger.setLevel(logging.INFO) # # logging.basicConfig(level=logging.INFO, # # format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') # 控制台日志输出日志格式 # # Format = logging.Formatter(fmt="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") # fh = logging.FileHandler("test.log") # fh.setLevel(logging.DEBUG) # fh.setFormatter(Format) # logger.addHandler(fh) # # sh = logging.StreamHandler() # sh.setLevel(logging.INFO) # sh.format(Format) # logger.addHandler(sh) # 重新封装logging中控制台和文件日志输出,当项目中存在多处日志打印时,可封装日志模块 class Logger: def __init__(self, name, sh_level, ft_level, path): self.logger = logging.getLogger(name) self.logger.setLevel(logging.INFO) Format = logging.Formatter( fmt="%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
#定义日志内容格式时,必须通过logging.Formatter(曾有遗漏) sh = logging.StreamHandler() sh.setLevel(sh_level) sh.setFormatter(Format) fh = logging.FileHandler(path) fh.setLevel(ft_level) fh.setFormatter(Format) self.logger.addHandler(sh) self.logger.addHandler(fh) def logging_info(self, message): self.logger.info(message) def logging_debug(self, message): self.logger.debug(message) def logging_warning(self, message): self.logger.warning(message) def logging_error(self, message): self.logger.error(message) def logging_critical(self, message): self.logger.critical(message) if __name__ == "__main__": test_log = Logger("clarence", logging.INFO, logging.DEBUG, 'test.log') test_log.logging_error("just test")