改变python记录器

2024-09-27 17:48:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在编写框架代码时,我经常希望记录调用者的行号和文件名。例如,如果我检测到framerwork级别API调用的不正确使用,我想记录这个。。。。不是框架内错误,而是“调用方错误”。你知道吗

这只有在编写使用内省的低级库和系统时才起作用。你知道吗

有没有办法让记录器记录“一级以上”?我可以创建一个定制的日志记录,然后修改它,并在安装的记录器中使用它吗?想弄清楚。你知道吗

例如:

def set(self, x):
   if x not in self._cols:
      log.error("Invalid attribute for set", stack_level=-1)

Tags: 代码self框架api文件名系统错误记录
1条回答
网友
1楼 · 发布于 2024-09-27 17:48:58

好吧,我想出来了。你知道吗

首先,您需要使用inspect获取框架。然后在日志中用信息修改extra=参数。但是您还必须重写makerecord,以防止不适当的保护阻止log使用文件名和行号重写。你知道吗

def myMakeRecord(self, name, level, fn, lno, msg, args, exc_info, func, extra, sinfo):
    rv = logging.LogRecord(name, level, fn, lno, msg, args, exc_info, func, sinfo)
    if extra is not None:
        rv.__dict__.update(extra)
    return rv

def mylog(logger, msg, level, *args)
    logging.Logger.makeRecord = myMakeRecord
    frame = inspect.currentframe()
    caller = frame.f_back
    override = {
        "lineno":caller.f_lineno,
        "filename":os.path.basename(caller.f_code.co_filename),
    }
    logger.log(level, msg, extra=override, *args)

奇怪的是,当extra和sinfo的默认值为none时(就像在最初的定义中那样),我无法使它工作。也许myMakeRecord应该使用*args。。。。但这需要抓住extra = args[9]。。。这很奇怪。。。。但可能不那么糟糕(更可能是未来的证明)。你知道吗

相关问题 更多 >

    热门问题