所以,我有一个返回调用堆栈的简单字符串的方法。
def call_stack():
if "inspect" not in globals().keys():
import inspect
stack = [frame[3] for frame in inspect.stack() if frame[3] not in [inspect.stack()[0][3],"<module>"]]
s = ""
for method in stack:
if len(s) > 0:
s += "."
s += method
return s
def modify_logger(logger):
logger.args["call_stack"] = call_stack()
是否可以创建此行为?
import logging
logging.basicConfig(level=logging.DEBUG, format="%(call_stack)s -- %(levelname)s: %(message)s")
def bar():
logging.debug("test")
def foo():
bar()
def monkey():
foo()
# modify root logger.
modify_logger(logging.getLogger())
# write to the log.
monkey()
结果如下:
monkey.foo.bar -- DEBUG: test
答案 0 :(得分:1)
也许最简单的方法就是定义自定义debug
函数:
import logging
def call_stack():
if "inspect" not in globals().keys():
import inspect
stack = [frame[3] for frame in inspect.stack()
if frame[3] not in [inspect.stack()[0][3],"<module>"]]
s='.'.join(reversed(stack))
return s
def debug(message):
logging.debug('{s} -- DEBUG: {m}'.format(
s=call_stack()[:-len('debug.')],m=message))
logging.basicConfig(level=logging.DEBUG, format="%(message)s")
def bar():
debug("test")
def foo():
bar()
def monkey():
foo()
monkey()
产量
monkey.foo.bar -- DEBUG: test
答案 1 :(得分:1)
昨天对这个模式进行了相当多的研究之后,我意识到我想要的东西对Python语言来说并不合理。毕竟,它是一种解释型语言,这意味着在已知路径上始终存在一个文件和一个可以引用的行号。在
故事的道德
当人们告诉你,你要求的东西没有意义时,不要把它们写下来。花一些时间仔细检查您的原始请求以及您的观点,然后再积极寻求在您的特定用例或背景下可能没有意义的问题的答案。
答案 2 :(得分:1)
我尝试将你的解决方案与另一个混合,它给了我正在寻找的结果。
import logging
DEBUG = True
TRACE = True
#-----------------------------------------------------------------------------
# TRACE BACK
#-----------------------------------------------------------------------------
class ContextFilter(logging.Filter):
def filter(self, record):
import traceback
if "inspect" not in globals().keys():
import inspect
stack = [frame[3] for frame in inspect.stack()
if frame[3] not in [inspect.stack()[0][3],"<module>"]]
record.stack ='.'.join(reversed(stack))
return True
#----------------------------------------------------------------------- ---------
# LOGGER
#--------------------------------------------------------------------------------
logger = logging.getLogger()
if TRACE:
logger.addFilter(ContextFilter())
if DEBUG:
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(stack)s\n{%(pathname)s:%(lineno)d} - %(asctime)s - %(levelname)s - %(message)s')
fh = logging.FileHandler('log_filename.txt')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)
else:
logger.setLevel(logging.NOTSET)
print 'NOT IN DEBUG MODE: Logging.NOTSET'