700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【python】logging日志实时打印到控制台+输出到文件【总结篇】

【python】logging日志实时打印到控制台+输出到文件【总结篇】

时间:2022-02-09 19:12:45

相关推荐

【python】logging日志实时打印到控制台+输出到文件【总结篇】

一、日志:

日志跟踪运行软件所发生事件的方法;

日志的作用:信息查询、服务诊断、数据分析

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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。