一、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()