python如何用 logging 实现控制台和文本同时输出?
方式一:用函数的方式实现
import logging # 第一步:创建日志器 logger = logging.getLogger("XX科技公司") # 第二步:定义处理器。控制台和文本输出两种方式 console_handler = logging.StreamHandler() file_handler = logging.FileHandler("./new.log",mode='a',encoding='utf-8') # 第三步:设置的不同的输入格式 console_fmt = "%(name)s-->%(levelname)s-->%(asctime)s" file_fmt = "%(lineno)d-->%(asctime)s-->%(levelname)s" # 第三步:格式 fmt1 = logging.Formatter(fmt=console_fmt) fmt2 = logging.Formatter(fmt=file_fmt) # 第四步:把格式传给处理器 console_handler.setFormatter(fmt1) file_handler.setFormatter(fmt2) # 第五步:把处理器传个日志器 logger.addHandler(console_handler) logger.addHandler(file_handler) logger.debug("debug 信息") logger.info("info 信息") logger.warning("warning 信息") logger.error("error 信息") logger.critical("critical 信息")
方式二:用类的方式实现
import logging class Log(): def __init__(self,level="DEBUG"): # 日志器对象 self.log = logging.getLogger('XX公司') self.log.setLevel(level) def console_handle(self,level="DEBUG"): '''控制台处理器''' console_handle = logging.StreamHandler() console_handle.setLevel(level) # 处理器添加格式器 console_handle.setFormatter(self.get_formatter()[0]) return console_handle def file_handle(self,level="DEBUG"): '''文件处理器''' file_handler = logging.FileHandler("./demo2.log",mode="a",encoding="utf-8") # 注① file_handler.setLevel(level) file_handler.setFormatter(self.get_formatter()[1]) return file_handler def get_formatter(self): '''格式器''' # 定义输出格式 console_fmt = logging.Formatter(fmt="%(name)s--%(levelname)s--%(asctime)s--%(message)s") file_fmt = logging.Formatter(fmt="%(levelname)s--%(asctime)s--%(message)s") return console_fmt,file_fmt def get_log(self): # 日志器添加控制台处理器 self.log.addHandler(self.console_handle()) # 日志器添加文件处理器 self.log.addHandler(self.file_handle()) # 返回日志实例对象 return self.log if __name__ == '__main__': log = Log() logger = log.get_log() logger.info("第一条信息") logger.info("第二条信息")
# 注①
# project_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 项目路径 .../project1 可以考虑增加项目路径
# 项目路径增加方法 https://www.cnblogs.com/juankai/p/11580122.html
参考资料:
https://www.bilibili.com/video/BV1aQ4y1R7Z6?p=3&vd_source=6176e79b66461eb74da787cb8321925b