gpt4 book ai didi

python - 结合 Python 跟踪信息和日志记录

转载 作者:行者123 更新时间:2023-12-03 21:49:09 25 4
gpt4 key购买 nike

我正在尝试编写一个高度模块化的 Python 日志系统(使用日志模块)并在日志消息中包含来自跟踪模块的信息。
例如,我希望能够编写如下代码行:

my_logger.log_message(MyLogFilter, "this is a message")
并让它包含“log_message”调用的位置,而不是实际的记录器调用本身。
除了跟踪信息来自 logging.debug() 之外,我几乎可以使用以下代码。打电话而不是 my_logger.log_message()一。
class MyLogFilter(logging.Filter):

def __init__(self):
self.extra = {"error_code": 999}
self.level = "debug"

def filter(self, record):
for key in self.extra.keys():
setattr(record, key, self.extra[key])

class myLogger(object):

def __init__(self):
fid = logging.FileHandler("test.log")
formatter = logging.Formatter('%(pathname)s:%(lineno)i, %(error_code)%I, %(message)s'
fid.setFormatter(formatter)

self.my_logger = logging.getLogger(name="test")
self.my_logger.setLevel(logging.DEBUG)
self.my_logger.addHandler(fid)

def log_message(self, lfilter, message):
xfilter = lfilter()
self.my_logger.addFilter(xfilter)
log_funct = getattr(self.logger, xfilter.level)
log_funct(message)

if __name__ == "__main__":

logger = myLogger()
logger.log_message(MyLogFilter, "debugging")

为了制作一个简单的 logging.debug,要经历很多麻烦。打电话,但实际上,我会列出许多不同版本的 MyLogFilter在包含不同“error_code”属性值的不同日志记录级别,我正在尝试制作 log_message()调用尽可能短而甜美,因为它会重复无数次。
我将不胜感激有关如何做我想做的事情的任何信息,或者如果我完全走错了路,如果是这样,我应该做什么。
如果可能的话,我想坚持使用“日志记录”和“跟踪”的内部 python 模块,而不是使用任何外部解决方案。

最佳答案

or if I'm completely off on the wrong track and if that's the case, what I should be doing instead.


我强烈建议您将日志记录视为已解决的问题,并避免重新发明轮子。
如果您需要的不仅仅是标准库的 logging模块提供,它可能类似于 structlog ( pip install structlog)
Structlog 将为您提供:
  • 数据绑定(bind)
  • 云原生结构化日志
  • 管道
  • ...以及更多

  • 它将处理大多数本地和云用例。
    下面是一种常见的配置,它将彩色日志输出到 .log 文件、标准输出,并且可以进一步扩展以记录到例如 AWS CloudWatch。
    请注意,其中包含一个处理器: StackInfoRenderer -- 这将包括所有日志调用的堆栈信息,其中 stack_info 具有“真实”值(这也在 stdlib 的日志记录中)。如果您只想要异常的堆栈信息,那么您需要为您的日志调用执行类似 exc_info=True 的操作。
    主文件
    from structlog import get_logger
    from logging_config import configure_local_logging

    configure_local_logging()
    logger = get_logger()

    logger.info("Some random info")
    logger.debug("Debugging info with stack", stack_info=True)

    try:
    assert 'foo'=='bar'
    catch Exception as e:
    logger.error("Error info with an exc", exc_info=e)
    logging_config.py
    import logging
    import structlog

    def configure_local_logging(filename=__name__):
    """Provides a structlog colorized console and file renderer for logging in eg ING tickets"""

    timestamper = structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S")
    pre_chain = [
    structlog.stdlib.add_log_level,
    timestamper,
    ]

    logging.config.dictConfig({
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
    "plain": {
    "()": structlog.stdlib.ProcessorFormatter,
    "processor": structlog.dev.ConsoleRenderer(colors=False),
    "foreign_pre_chain": pre_chain,
    },
    "colored": {
    "()": structlog.stdlib.ProcessorFormatter,
    "processor": structlog.dev.ConsoleRenderer(colors=True),
    "foreign_pre_chain": pre_chain,
    },
    },
    "handlers": {
    "default": {
    "level": "DEBUG",
    "class": "logging.StreamHandler",
    "formatter": "colored",
    },
    "file": {
    "level": "DEBUG",
    "class": "logging.handlers.WatchedFileHandler",
    "filename": filename + ".log",
    "formatter": "plain",
    },
    },
    "loggers": {
    "": {
    "handlers": ["default", "file"],
    "level": "DEBUG",
    "propagate": True,
    },
    }
    })

    structlog.configure_once(
    processors=[
    structlog.stdlib.add_log_level,
    structlog.stdlib.PositionalArgumentsFormatter(),
    timestamper,
    structlog.processors.StackInfoRenderer(),
    structlog.processors.format_exc_info,
    structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
    ],

    context_class=dict,
    logger_factory=structlog.stdlib.LoggerFactory(),
    wrapper_class=structlog.stdlib.BoundLogger,
    cache_logger_on_first_use=True,
    )
    Structlog 可以做的远不止这些。我建议你检查一下。

    关于python - 结合 Python 跟踪信息和日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63404899/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com