ydf0509 / nb_log

pip install nb_log 各种日志handler和自动转化项目的任意print的效果。日志自动彩色炫酷,可点击控制台的日志自动精确跳转到pycharm的文件和行号。文件日志多进程切割安全。在10个最重要方面全方位超过loguru
375 stars 72 forks source link

Log level for handler is hardcoded? #42

Closed killbus closed 1 year ago

killbus commented 1 year ago

https://github.com/ydf0509/nb_log/blob/c0f5d2979c8e50a43f15399a0683ecf1650b17f6/nb_log/log_manager.py#L331

ydf0509 commented 1 year ago

loging.DEBUG 10 ,loging.INFO 就是20,loging.WARNING就是30, 你自己打印python标准库的常量定义就知道了,这个数字不是nb_log乱发明定义的数值大小,是python标准内置库定义的常量数字。

killbus commented 1 year ago

我指的是这个位置:

https://github.com/ydf0509/nb_log/blob/c0f5d2979c8e50a43f15399a0683ecf1650b17f6/nb_log/log_manager.py#L340-L349

https://github.com/ydf0509/nb_log/blob/c0f5d2979c8e50a43f15399a0683ecf1650b17f6/nb_log/log_manager.py#L330-L333

期望结果不应该是:

 def __add_a_hanlder(self, handlerx: logging.Handler): 
     # handlerx.setLevel(10) 
     handlerx.setFormatter(self._formatter) 
     self.logger.addHandler(handlerx) 
ydf0509 commented 1 year ago

handler对象可以设置日志级别,logger对象也可以设置日志级别的。这是自由组合的,例如你logger是info级别,handler设置debug级别,最终你使用logger.debug还是不会记录日志的。handler级别如果是warnig,你logger.info也不会记录的。 nb_log是把添加hanlder内置化了,不希望暴露太多自由复杂组合的hanlder,所以这里设置10没毛病的。如果handler级别比logger级别低,那就是按照logger的日志级别了,例如你设置logger日志级别为logging.ERROR,你的handler级别设置DEBUG INFO ERROR 都是等效的,只要handler级别不高于logger的级别,你设置任何handler级别都是一样的效果。

你现在出了啥问题呢,难道你设置logger日志界别为20,我代码的handler级别设置了10,难道导致记录了你logger.debug的消息了吗。

killbus commented 1 year ago

感谢解惑。

如果 __add_a_hanlder() 里固定会给 handler 设置级别 10,那 __add_handlers() 里面在调用 __add_a_hanlder() 之前给 handler 设置级别不是没有意义了吗?

我碰到的问题:

相同 logger ,不同级别的日志使用不同的 handler

from nb_log import get_logger

get_logger(__name__, log_level_int=4, is_add_stream_handler=False, ding_talk_token='token')
logger = get_logger(__name__, log_level_int=2, is_add_stream_handler=True)

logger.handlers
# [<DingTalkHandler (DEBUG)> dingtalk token is token, <ColorHandler <stdout> (DEBUG)>]

logger.info('foo')

# 非期望行为: DingTalkHandler 处理了这个 info 日志

# 获得期望行为的改动:
logger.handlers[0].setLevel(40)
logger.handlers[1].setLevel(20)

logger.info('foo') # ColorHandler
logger.error('foo') # DingTalkHandler
ydf0509 commented 1 year ago

你意思是先一个logger,根据不同的消息级别,高级别的严重消息发钉钉。

nb_log希望用户实例化两个不同的logger来实现这件事情,例如logger2 = nblog.get_logger("aaa",is_add_dingtalk=True),这样你用logger2.info的就会记录到钉钉了,你不希望发钉钉的消息用logger1 = nblog.get_logger("bbb",) logger1.info() 就可以了。 使用不同的logger对象就好了,这样就可以控制某条消息发送钉钉了

killbus commented 1 year ago

如果命名空间像这种 get_logger('django.request') 的,如何实现呢?

ydf0509 commented 1 year ago

如果命名空间像这种 get_logger('django.request') 的,如何实现呢?

logging包内置的,用了享元模式。 logging.getLogger("abcd") is logging.getLogger("abcd") 结果是True, logging.getLogger("abcd") is logging.getLogger("efgh") 结果是False,

killbus commented 1 year ago

那要捕捉第三方包的日志并根据不同的消息级别,高级别的严重消息发钉钉 就不能简单实现了,对么?

给 handler 调整日志级别,与 Logger 一致。这样做会有什么不妥吗?毕竟我这样做,似乎可以简单实现我的需求。

logger.handlers[0].setLevel(40) # DingTalkHandler
logger.handlers[1].setLevel(20) # ColorHandler
ydf0509 commented 1 year ago

可以的,你这样写