python中nb_log的应用

一、python日志模块

python的日志模块如何封装一值都是一个头疼的问题,封装的不好总是会出现重复打印等头疼问题。
现在终于找到一个最好用的日志模块nb_log,此日志模块由这位大佬开发的https://www.cnblogs.com/ydf0509/

二、nb_log安装

直接 pip install nb_log 进行安装

三、功能介绍

1. 自动转换print效果

再也不怕有人在项目中随意print,导致很难找到是从哪里冒出来的print。
只要import nb_log,项目所有地方的print自动现型并在控制台可点击几精确跳转到print的地方。

2. 兼容性

使用的是python的内置logging封装的,返回的logger对象的类型是py官方内置日志的Logger类型,兼容性强,
保证了第三方各种handlers扩展数量多和方便,和一键切换现有项目的日志。

3. 日志记录到多个地方

内置了一键入参,每个参数是独立开关,可以把日志同时记录到8个常用的地方的任意几种组合,
包括 控制台 文件 钉钉 邮件 mongo kafka es 等等 。在第8章介绍实现这种效果的观察者模式。

4. 日志命名空间独立

采用了多实例logger,按日志命名空间区分。
命名空间独立意味着每个logger单独的日志界别过滤,单独的控制要记录到哪些地方。

logger_aa = LogManager('aa').get_logger_and_add_handlers(10,log_filename='aa.log')
logger_bb = LogManager('bb').get_logger_and_add_handlers(30,is_add_stream_handler=False,
ding_talk_token='your_dingding_token')
logger_cc = LogManager('cc').get_logger_and_add_handlers(10,log_filename='cc.log')

四、使用演示

import time

from nb_log import LogManager
from nb_log.handlers import ColorHandler


class TestLog:

    """测试没有handlers的日志"""
    def test_logger_without_handlers(self):
        my_log = LogManager("my_log").get_logger_without_handlers()
        print("这一条日志会打印")
        my_log.info("这一条不会打印")

    """这样可以在具体的地方任意写debug和info级别日志,只需要在总闸处规定级别就能过滤,很方便"""
    def test_handler(self):
        my_log = LogManager().get_logger_and_add_handlers(log_level_int=2)
        my_log.debug("调试日志不会被打印")
        my_log.info("信息日志会被打印")

    "测试将日志信息写入到文件"
    def test_write_log_to_file(self):
        my_log = LogManager().get_logger_and_add_handlers(log_filename="testlog.log")
        my_log.debug("调试日志会被写入文件")
        my_log.info("信息日志会被写入文件")

    "测试将日志信息写入到邮箱"
    def test_send_log_to_email(self):
        """
        将is_add_mail_handler邮箱开发打开
        同时修改nb_log_config_default中的邮箱配置
        """
        my_log = LogManager().get_logger_and_add_handlers(is_add_mail_handler=True)
        my_log.debug("调试日志会被写入邮箱")
        my_log.info("信息日志会被写入邮箱")

    "测试将日志信息发送到钉钉"
    def test_send_log_to_dingding(self):
        my_log = LogManager("testdinding").get_logger_and_add_handlers(ding_talk_token="your_dingding_token", ding_talk_time_interval=10)
        my_log.info("信息日志会被写入钉钉")

    "测试删除handler"
    def test_remove_handler(self):
        my_log = LogManager("test13").get_logger_and_add_handlers()
        my_log.info("去除ColorHandler前,此条日志会被打印")
        LogManager("test13").remove_handler_by_handler_class(ColorHandler)
        my_log.info("去除ColorHandler后,日志不会被打印")

    "测试彩色日志和日志写入mongodb"
    def test_color_mongo_handler(self):
        logger = LogManager('helloMongo').get_logger_and_add_handlers(mongo_url="connect_url", formatter_template=5)
        for i in range(100000):
            time.sleep(1)
            logger.debug('一个debug级别的日志。' * 5)
            logger.info('一个info级别的日志。' * 5)
            logger.warning('一个warning级别的日志。' * 5)
            logger.error('一个error级别的日志。' * 5)
            logger.critical('一个critical级别的日志。' * 5)

五、关于日志的观察者模式

观察者模式介绍可参考:https://zhuanlan.zhihu.com/p/80222260

例如 日志想实现记录到 控制台、文件、钉钉群、redis、mongo、es、kafka、发邮件其中的几种的任意组合。


from nb_log import LogManager


"观察者模式"
"观察者"
class TestControlLog:
    def __init__(self, name):
        self.name = name

    def print_control_log(self):
        my_log = LogManager(self.name).get_logger_and_add_handlers()
        my_log.info("{}负责打印控制台日志".format(self.name))


class TestFileLog:
    def __init__(self, name):
        self.name = name

    def print_file_log(self):
        my_log = LogManager(self.name).get_logger_and_add_handlers(log_filename=r"D:\venus-ui-test\UI_test\case\aa_test\testlog.log", is_add_stream_handler=False)
        my_log.info("{}负责打印文件日志".format(self.name))


"通知者"
class TestNotifyLog:
    actions = []

    @classmethod
    def add_action(cls, action):
        cls.actions.append(action)

    @classmethod
    def remove_action(cls, action):
        cls.actions.remove(action)

    @classmethod
    def send_action_info(cls):
        for action in cls.actions:
            action()


class TestNbLog:
    def test_nb_log(self):
        control_log = TestControlLog("control_log")
        file_log = TestFileLog("file_log")

        notice = TestNotifyLog()
        notice.add_action(control_log.print_control_log)
        notice.add_action(file_log.print_file_log)

        # 进行通知的发布
        notice.send_action_info()
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值