• python中logging库使用记录


    1、基本使用

    1 import logging
    2 
    3 logging.info("info")
    4 logging.warning("warning")
    5 logging.error('error')

    上述代码仅会在控制台输出:

    WARNING:root:warning
    ERROR:root:error

    因为默认仅输出WARNING及以上级别的日志常用的级别由高到低有:CRITICAL、ERROR、WARNING、INFO、DEBUG

    输出的格式默认为:

    %(levelname)s:%(name)s:%(message)s
    -levelname:级别名称;
    -name:日志收集器的名称,默认为root;
    -message:日志内容;

    要想输出其他等级的日志,需要改变输出级别,如下介绍两种方法;

     

    2、改变输出的级别

    2.1 使用basicConfig()方法

    如果logger没有指定处理器,则会默认使用basicConfig,在里面可以对日志进行一些设置。该方法传关键字参数,看下常用的参数:

    • filename:文件名;新建一个文件处理器FileHandler。并且把日志输出到该文件,此时日志不再在控制台输出;
    • filemode:打开文件的方式;如果指定了filename,则可以指定该参数;默认a,表示追加;w,表示覆盖;
    • format:指定日志输出的字符串格式;例如:format='%(levelname)s-%(name)s-%(asctime)s: %(message)s'
    • datefmt:指定输出的时间格式;例如:datefmt='%Y-%m-%d'
    • level:指定最低输出日志的等级;例如:level='INFO' 则INFO及以上级别的日志均能被输出
    • stream:用例初始化一个StreamHandler;如果filename存在,则程序忽略stream;
    • encoding:指定filname时,可以通过该参数设置编码;

    使用示例:

    1 logging.basicConfig(filename='logout.txt',
    2                     filemode='a',
    3                     format='%(levelname)s-%(name)s-%(asctime)s: %(message)s',
    4                     level='INFO',
    5                     datefmt='%Y-%m-%d')
    6 # 在logout.txt文件输出结果:
    7 # INFO-root-2022-06-09: info
    8 # WARNING-root-2022-06-09: warning
    9 # ERROR-root-2022-06-09: error
    View Code

     2.2 创建日志收集器和设置输出渠道

    (一)创建日志收集器
    logging.getLogger('py')   py即收集器的名称,会在文件/控制台输出;如果不传名称,则默认使用RootLogger;
    (二)设置输出渠道
    • FileHandler:文件输出;
    1. 需要指定filename;模式默认是a(追加),模式同open函数;
    2. setLevel指定输出的等级;
    • StreamHandler:控制台输出;
    1. setLevel指定输出的等级;
     1 #1、创建日志收集器
     2 my_log = logging.getLogger('py')
     3 my_log.setLevel('DEBUG') #设置采集等级
     4 #2、 设置输出渠道
     5 # 2-1 可以同时设置两个输出渠道
     6 sh = logging.StreamHandler() #2-1-1控制台输出,设置输出等级
     7 sh.setLevel('DEBUG')
     8 fh = logging.FileHandler("logout.txt") #2-1-2文件输入
     9 fh.setLevel('DEBUG')
    10 # 2-2 设置日志字符串格式
    11 format = logging.Formatter("%(levelname)s-%(name)s-%(asctime)s: %(message)s")
    12 # 2-2-1 两种输出渠道都设置format格式
    13 sh.setFormatter(format)
    14 fh.setFormatter(format)
    15 # 2-3 给日志收集器设置输出渠道
    16 my_log.addHandler(sh)
    17 my_log.addHandler(fh)
    18 
    19 #使用日志收集器采集日志
    20 my_log.debug('debug')
    21 my_log.info('info')
    22 my_log.warning('warning')
    23 my_log.error('error')
    View Code

     

    3、封装成类

    最后,把logger封装成一个类方便调用:

     1 import logging
     2 
     3 
     4 class MyLog():
     5 
     6     def __init__(self,filepath=None):#测试用例中setup中初始化一个实例
     7     #1、创建日志收集器
     8         self.my_log = logging.getLogger('py')
     9         self.my_log.setLevel('DEBUG') #设置采集等级
    10         #2、 设置输出渠道
    11         # 2-1 可以同时设置两个输出渠道
    12         self.sh = logging.StreamHandler() #2-1-1控制台输出,设置输出等级
    13         self.sh.setLevel('DEBUG')
    14         self.fh = logging.FileHandler("logout.txt") #2-1-2文件输入
    15         self.fh.setLevel('DEBUG')
    16         # 2-2 设置日志字符串格式
    17         format = logging.Formatter("%(levelname)s-%(name)s-%(asctime)s: %(message)s")
    18         # 2-2-1 两种输出渠道都设置format格式
    19         self.sh.setFormatter(format)
    20         self.fh.setFormatter(format)
    21         # 2-3 给日志收集器设置输出渠道
    22         self.my_log.addHandler(self.sh)
    23         self.my_log.addHandler(self.fh)
    24 
    25         # self.sh.close()  #把输出渠道写在构造函数里暂时没找到合适的位置关闭处理器
    26         # self.fh.close()  #把输出渠道写在构造函数里暂时没找到合适的位置关闭处理器
    27 
    28     def info(self,msg):
    29         self.my_log.info(msg)
    30 
    31     def warning(self,msg):
    32         self.my_log.warning(msg)
    33 
    34     def error(self,msg):
    35         self.my_log.error(msg)
    36         
    37     def close(self): #测试用例中teardown中调用,否则会出现重复日志
    38         self.sh.close()
    39         self.fh.close()
    40         self.my_log.removeHandler(self.sh)
    41         self.my_log.removeHandler(self.fh)
    42 
    43 # 使用
    44 log = MyLog()
    45 log.info('info')
    46 log.warning('warning')
    47 log.error('error')
    View Code

    注意:一定要removehandler,否则会产生重复日志!(因为每次实例化都会去添加一个handler)

    End.

  • 相关阅读:
    windows 服务实现定时任务调度(Quartz.Net)
    C#编写windows服务,多服务为什么只启动一个(ServiceBase.Run)
    微服务之springCloud-docker-feign(四)
    微服务之springCloud-docker-comsumer(三)
    微服务之springCloud和docker-provide(二)
    docker探索-使用docker service管理swarm(十一 )
    微服务之springCloud和docker-Eureka(一)
    docker打开api remote接口设置
    docker探索-CentOS7中配置Docker的yum源并升级安装docker1.13(十)
    docker探索-docker私有仓库搭建(九)
  • 原文地址:https://www.cnblogs.com/youreyebows/p/16358754.html
Copyright © 2020-2023  润新知