繁体   English   中英

如何将 loguru 与标准记录器一起使用?

[英]How to use loguru with standard loggers?

我想使用Loguru来拦截来自其他模块的记录器。

请问你们中的任何人都可以告诉如何处理这个话题吗?

例子:

import logging
import requests
from loguru import logger

logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logger_requests = logging.getLogger('requests')
logger_requests.setLevel(logging.DEBUG)

logger.debug('Message through loguru')
requests.get('https://stackoverflow.com')

执行:

$ python test_logger.py  > /dev/null 
2021-03-23 19:35:27.141 | DEBUG    | __main__:<module>:10 - Message through loguru
DEBUG:Starting new HTTPS connection (1): stackoverflow.com:443
DEBUG:https://stackoverflow.com:443 "GET / HTTP/1.1" 200 None

明确回答...

您想重定向通过loguru记录的requests 如评论中所述,您可以使用:

logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)

但是,还值得一提的是,如果在脚本执行期间发生任何事情,使用logger.catch()装饰函数将大大改善错误回溯。

import logging
import sys

import requests
from loguru import logger


class InterceptHandler(logging.Handler):
    """
    Add logging handler to augment python stdlib logging.

    Logs which would otherwise go to stdlib logging are redirected through
    loguru.
    """

    @logger.catch(default=True, onerror=lambda _: sys.exit(1))
    def emit(self, record):
        # Get corresponding Loguru level if it exists.
        try:
            level = logger.level(record.levelname).name
        except ValueError:
            level = record.levelno

        # Find caller from where originated the logged message.
        frame, depth = sys._getframe(6), 6
        while frame and frame.f_code.co_filename == logging.__file__:
            frame = frame.f_back
            depth += 1

        logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())


##########################################################################
# The logger.catch() decorator improves error tracebacks
#     ^^^^^^^^^^^^^^
##########################################################################
@logger.catch(default=True, onerror=lambda _: sys.exit(1))
def requests_http_get(url=None):
    logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
    logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)

    logger_requests = logging.getLogger('requests')
    logger_requests.setLevel(logging.DEBUG)
    logger.debug('Message through loguru')
    requests.get(url)

if __name__=="__main__":
    requests_http_get("https://stackoverflow.com/")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM