栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python之logging模块

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python之logging模块

首先介绍一下:
logging --是python自带的一个日志模块

它的作用主要有两个。

1、代替print,可以把大部分想要调试的信息打印出来或者是输出到指定的文件。
2、可以对一些输出的调试信息分类做输出,级别控制。

那么它的级别分为:debug/info/warning/error/critical

分别代表的意思:调试、打印、警告、错误、严重错误警告
每一级都是渐渐深入的过程。

运行下面一段代码:

import logging
# 级别控制:# 默认收集的是 warning (包括warning)以上的问题
logging.debug('小小今天很活跃')
logging.info('小小666')
logging.warning('pp')
logging.error('lll')
logging.critical('小夏')

控制台输出的是:

WARNING:root:pp
ERROR:root:lll
CRITICAL:root:小夏

为什么?因为默认收集的是 warning (包括warning)以上的问题
WARNING:root:pp 代表什么意思,即是:级别、日志收集器默认为root、内容

3、写日志需要经过的两个渠道:
Logger 收集日志 debug info error
handdler 输出日志的渠道,指定的文件,还是控制台,一般默认到控制台

import logging

# 定义一个日志收集器 # 如果不设置级别 或者 'python11' 为空,那么它将会默认从warning以上去收集(不包含warning)
my_logger = logging.getLogger('python11')
# 设定级别 注意的是  DEBUG 要大写
my_logger.setLevel('DEBUG')

# 创建我们自己的输出渠道,StreamHandler 输出到控制台
ch = logging.StreamHandler()
ch.setLevel('DEBUG')
# 把收集渠道和输出渠道对接
my_logger.addHandler(ch)

# 收集日志
my_logger.debug('python11期')
my_logger.info('pyton11期,6')
my_logger.error('python11期,最强!')

因为我们日志收集器设定的级别是:DEBUG 还有我们输出渠道定义的也是DEBUG,所有我们采集信息日志是从DEBUG开始采集的。

所以输出到控制台的结果是:

python11期
pyton11期,6
python11期,最强!

4、logging的应用:
(a)

import logging

# 创建一个收集器
my_logging = logging.getLogger('项目名称')
# 定义级别,收集的是DEBUG以上的级别
my_logging.setLevel('DEBUG')
# 定义一个输出到控制台的渠道Stream-->控制台Handler组织
ch = logging.StreamHandler()
# 定义一个输出到文件渠道
fh = logging.FileHandler('fhandler.txt', encoding='utf-8')
# 设置输出控制器的级别 输出的时候包含定义的级别,其中输出到控制台是error以上级别,输出到文本的是debug以上级别
ch.setLevel('ERROR')
fh.setLevel('DEBUG')
# 把收集控制器和输出控制器连接起来 指定到输出渠道
my_logging.addHandler(ch)
my_logging.addHandler(fh)

# 采集信息
my_logging.debug('控制住这条信息debug')
my_logging.info('控制住这条信息info')
my_logging.warning('控制住这条信息warning')
my_logging.error('控制住这条信息error')
my_logging.critical('控制住这条信息critical')

# 关闭日志收集器
my_logging.removeHandler(ch)
my_logging.removeHandler(fh)

输出结果是:

(b)
formatter:决定日志记录的最终输出格式(不然日志会乱七八糟)Formatter对象定义了最终log信息的顺序,
结构和内容,规定了日志输出按照什么样的格式,默认的时间格式为:%Y-%m-%d %H:%M:%S,下面是 formatter 常用的一些信息

import logging
# 创建一个收集器 名称:收到错误级别
my_logging = logging.getLogger('项目')
# 定义级别,收集的是DEBUG以上的级别
my_logging.setLevel('DEBUG')

# 设置输出格式:包括时间、级别、项目名,还有执行文件名等等
formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s')

# 定义一个输出到控制台  Stream-->控制台 Handler 组织,操作者
ch = logging.StreamHandler()
ch.setLevel('ERROR')
ch.setFormatter(formatter)

fh = logging.FileHandler('fhandler.txt', encoding='utf-8')# 文件路径可以自己设置
fh.setLevel('DEBUG')
fh.setFormatter(formatter)

# 把收集控制器和输出控制器连接起来 指定到输出渠道
my_logging.addHandler(ch)
my_logging.addHandler(fh)

# 采集信息
my_logging.debug('控制住这条信息debug')
my_logging.info('控制住这条信息info')
my_logging.warning('控制住这条信息warning')
my_logging.error('控制住这条信息error')
my_logging.critical('控制住这条信息critical')

# 关闭日志收集器
my_logging.removeHandler(ch)
my_logging.removeHandler(fh)

结果为:

控制台输出:

2021-10-04 21:00:45,525-ERROR-login_wk.py-项目-日志信息:控制住这条信息error
2021-10-04 21:00:45,525-CRITICAL-login_wk.py-项目-日志信息:控制住这条信息critical

文件fhandler.txt输出:

2021-10-04 21:00:45,524-DEBUG-login_wk.py-项目-日志信息:控制住这条信息debug
2021-10-04 21:00:45,525-INFO-login_wk.py-项目-日志信息:控制住这条信息info
2021-10-04 21:00:45,525-WARNING-login_wk.py-项目-日志信息:控制住这条信息warning
2021-10-04 21:00:45,525-ERROR-login_wk.py-项目-日志信息:控制住这条信息error
2021-10-04 21:00:45,525-CRITICAL-login_wk.py-项目-日志信息:控制住这条信息critical

最后写了一个类,方便定位级别和调用。

import logging

class My_log():

    def mylog(self, msg, level):
        # 创建一个收集器 名称:项目
        my_logging = logging.getLogger('项目')
        # 定义级别,收集的是DEBUG以上的级别
        my_logging.setLevel('DEBUG')

        # 设置输出格式
        formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s')

        # 定义一个输出渠道:StreamHandler 输出到控制台(包括ERROR)
        ch = logging.StreamHandler()
        ch.setLevel('ERROR')
        ch.setFormatter(formatter)  # 加上输出格式
        # FileHandler 输出到文本
        fh = logging.FileHandler(r'E:wkprojectclass_api_towfhandler.txt', encoding='utf-8')
        fh.setLevel('DEBUG')
        fh.setFormatter(formatter)  # 加上输出格式

        # 把收集控制器和输出控制器连接起来 指定到输出渠道
        my_logging.addHandler(ch)
        my_logging.addHandler(fh)

        # 收集信息
        if level == 'DEBUG':
            my_logging.debug(msg)
        elif level == 'INFO':
            my_logging.info(msg)
        elif level == 'WARNING':
            my_logging.warning(msg)
        elif level == 'ERROR':
            my_logging.error(msg)
        elif level == 'CRITICAL':
            my_logging.critical(msg)

        # 关闭日志收集器
        my_logging.removeHandler(ch)
        my_logging.removeHandler(fh)

    def debug(self, msg):
        self.mylog(msg, 'DEBUG')
    def info(self, msg):
        self.mylog(msg, 'INFO')
    def warning(self, msg):
        self.mylog(msg, 'WARNING')
    def error(self, msg):
        self.mylog(msg, 'ERROR')
    def critical(self, msg):
        self.mylog(msg, 'CRITICAL')


if __name__ == '__main__':
    my_logger = My_log()  # 引用实例
    my_logger.debug('昆山市')
    my_logger.error('多少岁的')
    my_logger.critical('啥大事')
    

最后是在实战中引用:
列如:

from class_api.class_chushi import Http_Ruests
import unittest
from class_api.class_demo_fanshe import GetData  # 方案二
from ddt import ddt, data, unpack
from class_api_tow.doexcel import DoExcel
from learning_wk.login_class.login_wk import My_log
my_logger = My_log()

test_data = DoExcel.doexcel('test_data.xlsx')

@ddt
class Http_Requests(unittest.TestCase):

    @data(*test_data)
    def test_login_True(self, item):
        res = Http_Ruests().login_requests(item['url'], eval(item['data']), item['method'], getattr(GetData, 'cookies'))
        if res.cookies:
            setattr(GetData, 'cookies', res.cookies)  # 方案二
        try:
            self.assertEqual(str(item['expected']), res.json()['code'])
            test_result = 'PASS'
        except AssertionError as e:
            test_result = 'failed'
            my_logger.info("执行用例出错 {}".format(e))  # 打印在文件中,不输出到控制台
            # print("执行用例出错 {}".format(e))
            raise e
        finally:
            DoExcel.write_back('test_data.xlsx', item['sheet_name'], item['mode'] + 1, str(res.json()), test_result)
            my_logger.error("获取到的结果是:{}".format(res.json()))  # 如果有错误会输出到控制台

        print(res.json())

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/293983.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号