首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在标准记录器中使用loguru?

如何在标准记录器中使用loguru?
EN

Stack Overflow用户
提问于 2021-03-23 18:46:01
回答 1查看 905关注 0票数 1

我想使用洛古鲁来拦截其他模块中的记录器。

你们中有谁能告诉我如何处理这个话题吗?

示例:

代码语言:javascript
复制
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')

执行:

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

发布于 2022-06-23 19:08:09

明确地回答..。

您希望通过requests重定向loguru日志记录。正如注释中提到的,您可以使用:

代码语言:javascript
复制
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)

但是,还值得一提的是,如果脚本执行过程中发生任何事情,用logger.catch()装饰函数将极大地改善错误跟踪功能。

代码语言:javascript
复制
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/")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66769431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档