【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:2022 2022/3/2 10:21
# Author: Jasmay
# -*- coding: utf-8 -*-
import logging
import time
import os
root_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().logger
if __name__ == '__main__':
logprint.debug("------这是debug信息---")
logprint.info("------这是info信息---")
logprint.warning("------这是warning信息---")
logprint.error("------这是error信息---")
logprint.critical("------这是critical信息---")
三、如何运用
# Time:2022 2022/3/2 10:21
# Author: Jasmay
# -*- coding: utf-8 -*-
import logging
import time
import os
root_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 logger
def sum(self,a,b):
try:
sum = a+b
self.log().info("{}+{}={}加法运算正确".format(a,b,sum))
return sum
except Exception as error:
self.log().error("{}+{}加法运算计算错误".format(a,b,error))
result = DemoLogger().sum(2,"a")
if __name__ == '__main__':
print(result)
来源:Jasmay