前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python日志处理logging模块详解

Python日志处理logging模块详解

作者头像
王大力测试进阶之路
发布2020-01-26 21:02:02
9430
发布2020-01-26 21:02:02
举报
文章被收录于专栏:橙子探索测试

logging模块简介

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点

1、可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息

2、print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出

日志等级(level)

DEBUG < INFO < WARNING < ERROR < CRITICAL

DEBUG 最详细的日志信息,典型应用场景是 问题诊断

INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作

WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的

ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息

CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息

logging模块可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃

logger

logger:日志对象,logging模块中最基础的对象,用logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名字我们对应模块名,如聊天模块、数据库模块、验证模块等

1. 为程序提供记录日志的接口

2. 判断日志所处级别,并判断是否要过滤

3. 根据其日志级别将该条日志分发给不同handler

其常用函数有:

Logger.setLevel() 设置日志级别

Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler

Logger.addFilter() 添加一个Filter

setLevel:设置日志等级

logger=logging.getLogger()

logger.setLevel(logging.DEBUG) #设置日志等级

logging

1、Formatter用于控制日志信息的最终输出格式

logging.Formatter(参数)

formatter=logging.Formatter('[%(asctime)s]-%(filename)s]-%(levelname)s:%(message)s')

%(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 用户输出的消息

2、Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。具体的应用如一个应用要把所有的日志打在文件中,并把ERROR以上级别的日志打印到屏幕,把CRITICAL级别的日志发邮件

常用函数有:

setLevel() 设置级别

setFormatter() 设置Formatter

logging.FileHandler(参数)创建一个FileHandler

logger.addHandler(fh)添加

logging.StreamHandler()创建一个 StreamHandler

logger.addHandler(ch)添加

# 创建一个FileHandler,用于写到本地

fh=logging.FileHandler(logname,'a',"utf-8")

fh.setLevel(logging.DEBUG)

fh.setFormatter(formatter)

logger.addHandler(fh)

# 创建一个 StreamHandler,用于输出到控制台

ch = logging.StreamHandler()

ch.setLevel(logging.DEBUG)

ch.setFormatter(formatter)

logger.addHandler(ch)

代码语言:javascript
复制
 import os,time,logging#
 日志存放路径
 log_path=os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),'logs')
 # 如果不存在这个logs文件夹,就自动创建一个
 if not os.path.exists(log_path):os.mkdir(log_path)
 class Log():
     def __init__(self):       
      #再日志路径下添加日志文件名        
      self.logname=os.path.join(log_path,'%s.log'%time.strftime('%Y_%m_%d'))        
      #logger日志对象初始化        
      self.logger=logging.getLogger()        
      #设置日志等级        
      self.logger.setLevel(logging.DEBUG)        
      #日志输出格式        
      self.formatter=logging.Formatter('[%(asctime)s]-%(filename)s]-%(levelname)s:%(message)s')    
      def __console(self,level,message):        
      # 创建一个 FileHandler,用于写到本地        
      fh=logging.FileHandler(self.logname,'a',"utf-8")        
      fh.setLevel(logging.DEBUG)        
      fh.setFormatter(self.formatter)        
      self.logger.addHandler(fh)        
      # 创建一个 StreamHandler,用于输出到控制台        
      ch = logging.StreamHandler()        
      ch.setLevel(logging.DEBUG)        
      ch.setFormatter(self.formatter)        
      self.logger.addHandler(ch)        
      if level=='info':          
        self.logger.info(message)        
      elif level=='debug':          
        self.logger.debug(message)        
      elif level=='warning':           
        self.logger.warning(message)        
      elif level=='error':           
        self.logger.error(message)        
      # 这两行代码是为了避免日志输出重复问题        
      self.logger.removeHandler(ch)        
      self.logger.removeHandler(fh)        
      # 关闭打开的文件        
      fh.close()    
  def debug(self, message):       
      self.__console('debug', message)    
  def info(self, message):       
      self.__console('info', message)   
  def warning(self, message):       
      self.__console('warning', message)    
  def error(self, message):      
     self.__console('error', message)
  if __name__ == "__main__":    
       log=Log()    
       log.info("---测试开始---")    
       log.info("操作步骤1,2,3")    
       log.warning("---测试结束---")   
       
       
       
       C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
       [2019-04-10 17:17:18,025]-test.py]-INFO:---测试开始---
       [2019-04-10 17:17:18,026]-test.py]-INFO:操作步骤1,2,3
       [2019-04-10 17:17:18,028]-test.py]-WARNING:---测试结束--- 
       
       
       Process finished with exit code 0
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 橙子探索测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档