Python之日志记录模块logging

一、简单的将日志打印到屏幕

【Python之日志记录模块logging】默认情况下,会打印WARNING级别的日志
DEBUG:详细信息,调试信息。
INFO:确认一切按预期运行。
WARNING:表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了')。软件还是在正常工作。
ERROR:由于更严重的问题,软件已不能执行一些功能了。
CRITICAL:严重错误,表明软件已不能继续运行了。
import logginglogging.debug('debug message') # 调试的时候 logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') # 批判的

以上代码输出:

Python之日志记录模块logging
文章图片
屏幕快照 2018-12-23 下午8.53.42.png
二、通过basicConfig函数来对日志的输入格式和方法进行配置
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被忽略
import logginglogging.basicConfig(level=logging.INFO,#默认为logging.WARNING filename="outlog.log",#指定日志输出文件, filemode="a",#和file函数意义相同,指定日志文件的打开式,'w'或'a' datefmt='%Y-%m-%d %a %H:%M:%S', # 指定输出的格式和内容,format可以输出很多有用信息 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' )# 声明了一个 Logger 对象,它就是日志输出的主类 logger = logging.getLogger(__name__)logger.debug('debug message') # 调试的时候 logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') # 批判的

三、同时将日志输出到屏幕和日志文件
  • 1、创建一个对象:
    logger = logging.getLogger()
  • 2、创建一个handler,用于写入日志文件:
    fh = logging.FileHandler('test.log',encoding='utf-8')
  • 3、或创建一个handler,用于输出到控制台 :
    ch = logging.StreamHandler()
  • 4、创建一个输出格式:
    fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s')
  • 5、给文件操作符设置一个格式:
    fh.setFormatter(fmt)
  • 6、或给控制台设置一个格式:
    ch.setFormatter(fmt)
  • 7、给logger对象添加fh对象:
    logger.addHandler(fh) 或给logger对象添加ch对象:logger.addHandler(ch)
import logging#声明了一个 Logger 对象,它就是日志输出的主类 logger = logging.getLogger(__name__) # 设置日志级别 logger.setLevel(logging.INFO) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler(filename="outlog.log",encoding="utf-8") # 创建一个handler,用于输出到控制台 sh = logging.StreamHandler() # 创建一个输出格式 fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s') # 文件操作符设置一个格式 fh.setFormatter(fmt=fmt) #给控制台设置一个格式 sh.setFormatter(fmt=fmt)# 给logger对象添加fh和sh对象 logger.addHandler(fh) logger.addHandler(sh)logger.debug('debug message') # 调试的时候 logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') # 批判的

四、通过配置文件方式使用logging模块
logger.conf配置文件
[loggers] # 定义logger模块,root是父类,必需存在的,其它的是自定义。 keys=root,infoLogger,errorlogger# 实现上面定义的loggers模块,必需是[logger_xxxx]这样的形式 [logger_root]# level级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL level=DEBUG# handlers 处理类,可以有多个,用逗号分开 handlers=infohandler,errorhandler[logger_infoLogger] # handlers 处理类 handlers=infohandler# qualnamelogger名称,应用程序通过 logging.getLogger获取。 # 对于不能获取的名称,则记录到root模块。 qualname=infoLogger# propagate 是否继承父类的log信息,0:否 1:是 propagate=0[logger_errorlogger] handlers=errorhandler qualname=errorlogger propagate=0###############################################[handlers] keys=infohandler,errorhandler[handler_infohandler] # 日志处理类,控制台输出类 class=StreamHandler # 日志级别 level=INFO # 设定日志格式 formatter=form02 # args handler初始化函数参数 args=(sys.stdout,)[handler_errorhandler] # 日志处理类,文件输出类 class=FileHandler # 日志级别 level=ERROR # 设定日志格式 formatter=form01 # args handler初始化函数参数,日志存放路径 args=('logging/outlog.log', 'a')###############################################[formatters] keys=form01,form02[formatter_form01] format=%(asctime)s %(filename)s %(levelname)s%(message)s datefmt=%Y-%m-%d %H:%M:%S[formatter_form02] format=%(asctime)s %(filename)s %(levelname)s%(message)s datefmt=%Y-%m-%d %H:%M:%S

使用方式:
from logging.config import fileConfig import loggingfileConfig('logger.conf') # 加载自定义的配置文件 logger=logging.getLogger('infoLogger') # 获得对应的日志对象 logger.info('test1') #输出对应的日志 logger_error=logging.getLogger('errorhandler')#获的对应的日志对象 logger_error.error('test5') # 输出对应的日志

使用这种方式配置日志,一定要在项目的入口函数中就调用 logging.config.fileConfig("logging.conf")函数,因为 logging.conf 文件中,在handler中配置的是日志文件的相对地址,如果在其他代码文件中进行调用,由于相对地址的原因,将导致日志文件会出现在意想不到的位置。
进行以上配置后,在项目中需要进行日志输出的地方通过logging.getLogger()方式就可以获取到对应的logger,然后就可以使用logger.info("xxx")进行日志输出了。

    推荐阅读