一、简单的将日志打印到屏幕
默认情况下,会打印WARNING级别的日志
DEBUG:详细信息,调试信息。
INFO:确认一切按预期运行。
WARNING:表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了')。软件还是在正常工作。
ERROR:由于更严重的问题,软件已不能执行一些功能了。
CRITICAL:严重错误,表明软件已不能继续运行了。
import logging
logging.debug('debug message') # 调试的时候
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message') # 批判的
以上代码输出:
二、通过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 logging
logging.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
# qualname logger名称,应用程序通过 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 logging
fileConfig('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")进行日志输出了。