如何在Python日志记录中区分文件和子模块?

我写了一个子模块,在那里定义了日志记录,因为我主要使用我的子模块在不同的rest api项目中重用代码。如何设置自定义日志记录,以便日志记录知道哪个代码(main.pysub.py)称为日志记录?我尝试使用__file__,但是它总是会显示“ sub.py”。

我的子模块:

# sub.py
import logging
from secrets import token_urlsafe

# https://stackoverflow.com/a/57820456/1150923
def record_factory(*args,**kwargs):
    record = old_factory(*args,**kwargs)
    record.session_id = session_id

    # What do I do here?
    # This doesn't work:
    record.src = __file__

    return record

session_id = token_urlsafe(8)

logger = logging.getLogger(__name__)
old_factory = logging.getLogRecordFactory()
logging.setLogRecordFactory(record_factory)

# Always prepend session_id and src to logs
format = logging.Formatter("%(asctime)s %(session_id) %(src) %(message)s",datefmt="%Y-%m-%d %H:%M:%S")
handler = logging.StreamHandler()
handler.setformatter(format)
logger.addHandler(handler)

logger.info("Hello!") # Should also print out "sub.py".

我的主要脚本:

# main.py
import logging
import sub

logger = logging.getLogger("sub")
logger.info("Hi!") # Should also print out "main.py".
draggon 回答:如何在Python日志记录中区分文件和子模块?

日志记录在名称__file__下为模块名称提供与pathname相同的值。

%(src)s替换为%(pathname)s

Logger的执行方式是通过Logger.findCaller方法中的堆栈检查。它沿栈向上移动,直到找到不在日志记录模块中的帧。然后提取该框架的文件名,lineno和函数名称。

有关__name__的问题,请参见Is module __file__ attribute absolute or relative?

,

在这种情况下,您可以使用检查模块。

import inspect as insp

def record_factory(*args,**kwargs):
    record = old_factory(*args,**kwargs)
    record.session_id = session_id

    (filename,line_number,func_name,lines,index) = insp.getframeinfo(insp.currentframe().f_back)

    #Do whatever with this values.
    return record

currentframe()的工作方式是返回调用者堆栈框架的框架对象。可以将其传递给getframeinfo()方法。

在此处查找更多详细信息:inspect Module

本文链接:https://www.f2er.com/2989148.html

大家都在问