Closed WenkeZhou closed 5 months ago
绕开了源码中,作者设置的两处限制。
log_manager.py
def revision_call_handlers(self, record):
c = self
found = 0
hdlr_type_set = set()
while c:
for hdlr in c.handlers:
hdlr_type = type(hdlr)
if hdlr_type == logging.StreamHandler: # REMIND 因为很多handler都是继承自StreamHandler,包括filehandler,直接判断会逻辑出错。
hdlr_type = ColorHandler
found = found + 1
if record.levelno >= hdlr.level:
if hdlr_type not in hdlr_type_set:
hdlr.handle(record)
hdlr_type_set.add(hdlr_type)
if not c.propagate:
c = None # break out
else:
c = c.parent
# noinspection PyRedundantParentheses
if (found == 0):
if logging.lastResort:
if record.levelno >= logging.lastResort.level:
logging.lastResort.handle(record)
elif logging.raiseExceptions and not self.manager.emittedNoHandlerWarning:
sys.stderr.write("No handlers could be found for logger"
" \"%s\"\n" % self.name)
sys.stderr.flush()
self.manager.emittedNoHandlerWarning = True
# noinspection PyProtectedMember
def revision_add_handler(self, hdlr): # 从添加源头阻止同一个logger添加同类型的handler。
"""
Add the specified handler to this logger.
"""
logging._acquireLock() # noqa
try:
""" 官方的
if not (hdlr in self.handlers):
self.handlers.append(hdlr)
"""
hdlrx_type_set = set()
for hdlrx in self.handlers:
hdlrx_type = type(hdlrx)
if hdlrx_type == logging.StreamHandler: # REMIND 因为很多handler都是继承自StreamHandler,包括filehandler,直接判断会逻辑出错。
hdlrx_type = ColorHandler
hdlrx_type_set.add(hdlrx_type)
hdlr_type = type(hdlr)
if hdlr_type == logging.StreamHandler:
hdlr_type = ColorHandler
if hdlr_type not in hdlrx_type_set:
self.handlers.append(hdlr)
finally:
logging._releaseLock() # noqa
新增了这个功能,看文档1.1.a2介绍,nb_log升级到 新版本
get_logger 传参了 error_log_filename 后,error级别以上的日志会单独写入到错误文件中。 或者 在nb_log_config.py 配置文件中 配置 AUTO_WRITE_ERROR_LEVEL_TO_SEPARATE_FILE = True # 自动把错误error级别以上日志写到单独的文件,根据log_filename名字自动生成错误文件日志名字。
个人需求:所有级别日志(包含错误日志)写入到 文件a, 错误日志 写到文件b。和 title 略有差别。
class CustomFileHandler(object): @classmethod def custom_fh(cls, log_path=CUSTOM_LOG_FILE_PATH, form_dict_type=5, log_level=logging.INFO): from nb_log.handlers import ConcurrentRotatingFileHandler fh = ConcurrentRotatingFileHandler(log_path, encoding="utf-8") fh.setLevel(log_level) fh.setFormatter(FORMATTER_DICT[form_dict_type]) return fh
from nb_log import get_logger from nb_log_config import CustomFileHandler
logger = get_logger(name) logger.addHandler(CustomFileHandler.custom_fh()) logger.addHandler(CustomFileHandler.error_fh())
logger.info(f"info 级别日志")
logger.error(f"error 级别日志")
2023-12-12 17:42:32 - main - "E:\nblog_test_err_info.py:12" - - INFO - info 级别日志
2023-12-12 17:42:32 - main - "E:\nblog_test_err_info.py:13" - - ERROR - error 级别日志
2023-12-12 17:42:32 - main - "E:\nblog_test_err_info.py:13" - - ERROR - error 级别日志