一、日志:
日志跟踪运行软件所发生事件的方法;
日志的作用:信息查询、服务诊断、数据分析
1.日志等级
debug: 调试信息
info: 描述重要事件
warning:警告信息
error: 报错异常信息
critical: 严重错误
2.python中如何生成日志:logging模块
(logging模块是python的内置模块:可以生成日志,包括可以设置日志等级、日志路径、日志文件回滚等)
3.logging和print的区别:
print :会输出到标准输出流中,格式为字符串格式
logging 模块:更加灵活
1)可以设置输出到任意位置,如写入文件、写入远程服务器等
2)设置日志等级,在不同的版本(如开发环境、生产环境)上通过设置不同的输出等级来记录对应的日志
3)具有灵活的配置和格式化功能,如配置输出当前模块信息、运行时间等,相比 print 的字符串格式化更加方便易用。可以在 logging 模块中非常灵活。
4.logging模块包括4个组件:
1)logger 日志器,提供了应用程序的接口
2)Handler 处理器,通过logger在不同位置输出日志
3)Formator 格式器,决定日志以什么样的格式显示
4)Filter 过滤器,过滤哪些需要记录输出,哪些需要丢弃
-----一个日志器,可以对应多个处理器;每个处理器可以有单独的格式器。
5.Formatter函数各参数:
可以指定日志的输出格式format,这个参数可以输出很多有用的信息
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被忽略
二、代码:
# Time: /3/2 10:21# Author: Jasmay# -*- coding: utf-8 -*-import loggingimport timeimport osroot_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))log_dir = os.path.join(root_dir,"logs")if not os.path.exists(log_dir):os.mkdir(log_dir)class DemoLogger():def __init__(self):# 创建一个日志器self.logger = logging.getLogger("logger")# 设置日志输出的最低等级,低于当前等级则会被忽略self.logger.setLevel(logging.INFO)# 创建处理器:sh为控制台处理器,fh为文件处理器sh = logging.StreamHandler()# 创建处理器:sh为控制台处理器,fh为文件处理器,log_file为日志存放的文件夹# log_file = os.path.join(log_dir,"{}_log".format(time.strftime("%Y/%m/%d",time.localtime())))log_file = os.path.join(log_dir,"autotest.log")fh = logging.FileHandler(log_file,encoding="UTF-8")# 创建格式器,并将sh,fh设置对应的格式formator = logging.Formatter(fmt = "%(asctime)s %(filename)s %(levelname)s %(message)s",datefmt="%Y/%m/%d %X")sh.setFormatter(formator)fh.setFormatter(formator)# 将处理器,添加至日志器中self.logger.addHandler(sh)self.logger.addHandler(fh)logprint = DemoLogger().loggerif __name__ == '__main__':logprint.debug("------这是debug信息---")logprint.info("------这是info信息---")logprint.warning("------这是warning信息---")logprint.error("------这是error信息---")logprint.critical("------这是critical信息---")
三、如何运用
# Time: /3/2 10:21# Author: Jasmay# -*- coding: utf-8 -*-import loggingimport timeimport osroot_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))log_dir = os.path.join(root_dir,"logs")if not os.path.exists(log_dir):os.mkdir(log_dir)class DemoLogger():def log(self):# 创建一个日志器logger = logging.getLogger("logger")# 设置日志输出的最低等级,低于当前等级则会被忽略logger.setLevel(logging.INFO)# 创建处理器:sh为控制台处理器,fh为文件处理器sh = logging.StreamHandler()# 创建处理器:sh为控制台处理器,fh为文件处理器,log_file为日志存放的文件夹# log_file = os.path.join(log_dir,"{}_log".format(time.strftime("%Y/%m/%d",time.localtime())))log_file = os.path.join(log_dir,"autotest.log")fh = logging.FileHandler(log_file,encoding="UTF-8")# 创建格式器,并将sh,fh设置对应的格式formator = logging.Formatter(fmt = "%(asctime)s %(filename)s %(levelname)s %(message)s",datefmt="%Y/%m/%d %X")sh.setFormatter(formator)fh.setFormatter(formator)# 将处理器,添加至日志器中logger.addHandler(sh)logger.addHandler(fh)return loggerdef sum(self,a,b):try:sum = a+bself.log().info("{}+{}={}加法运算正确".format(a,b,sum))return sumexcept Exception as error:self.log().error("{}+{}加法运算计算错误".format(a,b,error))result = DemoLogger().sum(2,"a")if __name__ == '__main__':print(result)