• 【python】Logging模块


     

    1.日志记录级别

    logging.debug<logging.info<logging.warning<logging.error<logging.critical

    关键是最高级别,debug是最低级别,即如果我们配置了“WARNING”的日志,我们的日志文件将包含WARNING,ERROR&CRITICAL的日志。默认日志消息是WARNING

    2.模块提供logger,handler,filter,formatter

    1)loger  

      提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。

    2)handler

      将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示

    3)filter

      提供一种优雅的方式决定一个日志记录是否发送到handler

    4)formater

      指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的

    3.logger用法

      1)始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字
      2)设置级别 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志
      3) Handler,常用的是StreamHandler和FileHandler,windows下你可以简单理解为一个是console和文件日志,一个打印在CMD窗口上,一个记录在一个文件上
      4) formatter,定义了最终log信息的顺序,结构和内容,我喜欢用这样的格式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S',
        %(name)s Logger的名字
        %(levelname)s 文本形式的日志级别
        %(message)s 用户输出的消息
        %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
        %(levelno)s 数字形式的日志级别
        %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
        %(filename)s 调用日志输出函数的模块的文件名
        %(module)s  调用日志输出函数的模块名
        %(funcName)s 调用日志输出函数的函数名
        %(lineno)d 调用日志输出函数的语句所在的代码行
        %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
        %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
        %(thread)d 线程ID。可能没有
        %(threadName)s 线程名。可能没有
        %(process)d 进程ID。可能没有

    4.编写logger案例

     1 import logging
     2 
     3 #创建logger对象
     4 logger=logging.getLogger(__name__)
     5 logger.setLevel(logging.INFO)
     6 
     7 #创建file handler
     8 handler_warn=logging.FileHandler("warning_log.txt")
     9 handler_warn.setLevel(logging.WARNING)
    10 
    11 #handler_info=logging.FileHandler("info_log.txt")
    12 #handler_info.setLevel(logging.INFO)
    13 
    14 handler_info=logging.StreamHandler()
    15 handler_info.setLevel(logging.INFO)
    16 
    17 #创建日志记录格式
    18 formatter=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s")
    19 
    20 #设置handler格式
    21 handler_warn.setFormatter(formatter)
    22 handler_info.setFormatter(formatter)
    23 
    24 #将handler添加至logger
    25 logger.addHandler(handler_warn)
    26 logger.addHandler(handler_info)
    27 
    28 logger.info("testinfo")
    29 logger.warning("testwarn")
    30 logger.error("testerror")
    31 logger.critical("testcritical")

    执行结果:

    控制台输出INFO信息,包括info,warning,error,critical

    warning_log.txt包括warning.error,critical

    若将logger设置为WARNING即,logger.setLevel(logging.WARNING),则控制台和txt中只显示WARNING及以上级别的信息

    5.对logger进行封装

     1 # coding:utf-8
     2 import logging, time, os
     3 # 这个是日志保存本地的路径
     4 log_path = "E:\automatic\sc\wdms_api\log_module"
     5 class Log:
     6     def __init__(self):
     7         # 文件的命名
     8         self.logname = os.path.join(log_path, '%s.log'%time.strftime('%Y_%m_%d'))
     9         self.logger = logging.getLogger()
    10         self.logger.setLevel(logging.DEBUG)
    11          # 日志输出格式
    14         self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s')
    15     def __console(self, level, message):
    16         #fh = logging.FileHandler(self.logname, 'a')  # 追加模式
    17         fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')    # 这个是python3的
    18         fh.setLevel(logging.DEBUG)
    19         fh.setFormatter(self.formatter)
    20         self.logger.addHandler(fh)
    21         # 创建一个StreamHandler,用于输出到控制台
    22         ch = logging.StreamHandler()
    23         ch.setLevel(logging.DEBUG)
    24         ch.setFormatter(self.formatter)
    25         self.logger.addHandler(ch)
    26         if level == 'info':
    27             self.logger.info(message)
    28         elif level == 'debug':
    29             self.logger.debug(message)
    30         elif level == 'warning':
    31             self.logger.warning(message)
    32         elif level == 'error':
    33             self.logger.error(message)
    34         # 这两行代码是为了避免日志输出重复问题
    35         self.logger.removeHandler(ch)
    36         self.logger.removeHandler(fh)
    37          # 关闭打开的文件
    38         fh.close()
    39     def debug(self, message):
    40         self.__console('debug', message)
    41     def info(self, message):
    42         self.__console('info', message)
    43     def warning(self, message):
    44         self.__console('warning', message)
    45     def error(self, message):
    46         self.__console('error', message)
    47 if __name__ == "__main__":
    48     log = Log()
    49     log.info("---测试开始----")
    50     log.info("输入密码")
    51     log.warning("----测试结束----")

    6.封装后logger的使用案例

     1 from selenium import webdriver
     2 from selenium.webdriver.support import expected_conditions as EC
     3 from log_module.log_module import Log
     4 import time
     5 import unittest
     6 import json
     7 import requests
     8 log=Log()
     9 class test_interface(unittest.TestCase):
    10     def setUp(self):
    11         pass
    12     def tearDown(self):
    13         pass
    14     
    15     #获取url
    16     def set_url(self,url):
    17         self.url="http://127.0.0.1:8081/api/"+url
    18         return self.url
    19     
    20     #获取sessionid
    21     def get_sessionid(self):
    22         payload={"username":"admin","password":"admin"}
    23         data_json=json.dumps(payload)
    24         url1=self.set_url("accounts/login/")
    25         #r=requests.post(url,data=data_json)
    26         s=requests.session()
    27         r1=s.post(url1, json=payload)
    28         result=r1.json()
    29         return r1.cookies
    30     
    31     #登录接口
    32     def test_login(self):
    33         log.info("-------测试登录接口-------")
    34         #u'测试登录接口'
    35         payload={"username":"admin","password":"admin"}
    36         data_json=json.dumps(payload)
    37         url=self.set_url("accounts/login/")
    38         r=requests.post(url,data=data_json)
    39         result=r.json()
    40         log.info(u"获取code值:%s"%result["code"])
    41         self.assertEqual(result["code"],200)
    42         log.info(u"message内容:%s"%result["message"])
    43         self.assertEqual(result["message"],"Login Successful")
    44     
    45 
    46 if __name__ == "__main__":
    47     unittest.main()
  • 相关阅读:
    vuex mapstate_学习 vuex 源码整体架构,打造属于自己的状态管理库
    正则表达式
    对 Kubernetes 部署进行故障排除的视觉指南
    Uber Go 语言编码规范
    云原生训练营结课总结
    谈谈 Kubernetes Operator
    npm run serve报错
    BATIS PLUS实体类中字段映射MYSQL中的JSON格式
    PHPCMS V9静态化HTML生成设置及URL规则优化
    phpcmsV9 文章页时间问题
  • 原文地址:https://www.cnblogs.com/dhs94/p/9011431.html
Copyright © 2020-2023  润新知