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

在Python日志记录中如何区分文件和子模块?,python,logging,python-module,Python,Logging,Python Module,我编写了一个子模块,其中定义了日志记录,因为我主要使用子模块在不同的RESTAPI项目中重用代码。如何设置自定义日志记录,以便日志记录知道哪个代码(main.py或sub.py)调用了日志记录?我试着使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 我的子模块: # sub.py import logging from secrets import token_urlsa

我编写了一个子模块,其中定义了日志记录,因为我主要使用子模块在不同的RESTAPI项目中重用代码。如何设置自定义日志记录,以便日志记录知道哪个代码(
main.py
sub.py
)调用了日志记录?我试着使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我的子模块:

# 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".

日志记录为模块名提供了一个属性,该属性的值与名为
路径名下的
文件名
相同

%(src)s
替换为
%(路径名)s

Logger
的工作方式是通过
Logger.findCaller
方法中的堆栈检查。它沿着堆栈向上移动,直到找到不在日志模块中的帧。然后提取该帧的文件名、行号和函数名


有关
\uuuuu name\uuuuu

的问题,请参阅。日志记录为模块名提供了一个属性,该属性的值与
路径名下的
\uuuu file\uuuuuu
相同

%(src)s
替换为
%(路径名)s

Logger
的工作方式是通过
Logger.findCaller
方法中的堆栈检查。它沿着堆栈向上移动,直到找到不在日志模块中的帧。然后提取该帧的文件名、行号和函数名


有关
\uuu name\uuu
的问题,请参阅。在这种情况下,您可以使用检查模块

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()方法中


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

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

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()方法中


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

知道为什么主文件只显示
/main.py
,而子模块显示完整路径,如
/Users/hobbes3/sub.py
?理想情况下,我希望它能给出这两个文件的完整路径。你知道为什么主文件只显示
/main.py
,而子模块显示
/Users/hobbes3/sub.py
这样的完整路径吗?理想情况下,我想说的是两者的完整路径。