python调用logging,记录日志的方法笔记
保存当前文件为logset.py,在其他py文件引用时,使用from logset import logger 格式导入
调用时,使用 logger.info(‘xxxxx’) 和 logger.dubug(‘xxxxxx’)即可。
# coding:utf-8
"""
该方法提供了记录日志的相关设置,定义了logger日志记录器.
调用logger.debug()/logger.info()/logger.warning()/logger.error()/logger.critical()方法可以记录并保存日志到调用程序所在路径下Log文件夹
示例:
logger.debug("打印日志测试,debug级别")
logger.info("dayinrizhiceshi,INFO级别")
logger.warning("打印日志等级测试,当前warning级别")
logger.error("error级别日志打印测试")
logger.critical("致命等级日志记录打印测试")
author:yutao
"""
import logging #调用python logging 方法库
from logging.handlers import RotatingFileHandler
import os
from datetime import datetime
"""
logging 库采取了模块化的设计,提供了许多组件:记录器、处理器、过滤器和格式化器。
Logger 暴露了应用程序代码能直接使用的接口。
Handler 将(记录器产生的)日志记录发送至合适的目的地。
Filter 提供了更好的粒度控制,它可以决定输出哪些日志记录。
Formatter 指明了最终输出中日志记录的内容和格式。
"""
CurrentTime = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") #获取当前时间,用于后面命名文件
CurrentPath = os.getcwd() #获取当前程序文件所在路径
path = CurrentPath + ("\\Log") #定义log文件存放路径
if not os.path.exists(path):
os.mkdir(path) #若当前程序文件路径无指定的log文件夹,则创建该文件夹
logger = logging.getLogger("Test") #获取一个logging记录器 Test
logger.setLevel(level = logging.DEBUG) #定义日志记录器记录日志的等级
'''
logging.DEBUG('debug级别,一般用来打印一些调试信息,级别最低')
logging.INFO('info级别,一般用来打印一些正常的操作信息')
logging.WARNING('waring级别,一般用来打印警告信息')
logging.ERROR('error级别,一般用来打印一些错误信息')
logging.CRITICAL('critical级别,一般用来打印一些致命的错误信息,等级最高')
'''
formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")
"""
Formatter模块:
为handler设置输出格式,handler是负责把日志输出到哪里,所以是给它设置格式,而不是给logger;
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息
"""
# 创建一个handler模块,将INFO等级的日志保存到文件名为CMDlog的文件中,保存简单地调试日志
file_handler = RotatingFileHandler("%s/CMDlog_%s.log"%(path,CurrentTime),maxBytes=5*1024*1024,backupCount=10)
file_handler.setLevel(level = logging.INFO)
file_handler.setFormatter(formatter)
# 创建一个handler模块,将DEBUG等级的日志保存到文件名为CR7log的文件中,保存详细的调试日志
file_handler2 = RotatingFileHandler("%s/CR7log_%s.log"%(path,CurrentTime),maxBytes=5*1024*1024,backupCount=3)
file_handler2.setLevel(level = logging.DEBUG)
file_handler2.setFormatter(formatter)
# 创建一个handler模块,将INFO等级的日志输出到控制台输出显示,方便查看实时运行调试状态
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)
# 启用创建的3个handler模块
logger.addHandler(file_handler)
logger.addHandler(file_handler2)
logger.addHandler(stream_handler)
"""
Handler 模块:
指定handler,它不知道要怎么处理日志,要输出到哪里去。那我们就给他加一个Handler吧,Handler的种类有很多,常用的有4种:
logging.StreamHandler -> 控制台输出
logging.FileHandler -> 文件输出
logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件
其中file_handler.setLevel(level = logging.DEBUG)需要再次设置,因为logger设置logger.setLevel(level = logging.DEBUG)
是告诉logger要记录哪些级别的日志,而给handler设置,是告诉它要输出哪些级别的日志,相当于进行了两次过滤。
这样的好处在于,当我们有多个日志去向时,比如既保存到文件,又输出到控制台,就可以分别给他们设置不同的级别;
logger 的级别是先过滤的,所以被 logger 过滤的日志 handler 也是无法记录的,这样就可以只改 logger 的级别而影响所有输出。
两者结合可以更方便地管理日志记录的级别。
"""
if __name__ == "__main__":
logger.debug("打印日志测试,debug级别")
logger.info("dayinrizhiceshi,INFO级别")
logger.warning("打印日志等级测试,当前warning级别")
logger.error("error级别日志打印测试")
logger.critical("致命等级日志记录打印测试")