是否可以在logging.Formatter中分割模块名称字符串?
例如,我有一个模块,其中包含一个名为foo.bar.baz
的对应记录器(基本上使用__name__
):
import logging
logger = logging.getLogger("foo.bar.baz")
logger.info("Test")
以及导入模块foo
并执行某些格式化的主文件:
import logging
import foo
logger = logging.getLogger("foo")
handler = logging.StreamHandler()
streamFormat = logging.Formatter('[{0}, {1}]: {2}'.format("{name}".split(".")[-1], "{levelname}", "{message}"), style='{')
handler.setFormatter(streamFormat)
logger.addHandler(handler)
我现在尝试实现的目标是:
[baz, INFO]: Test
但我得到的是:
[foo.bar.baz, INFO]: Test
我认为在格式化过程中实际字符串是未知的,这可以解释为什么拆分操作不起作用:
['foo.bar.baz']
有没有人知道是否有另一种方法可以摆脱模块路径的第一部分?
编辑:感谢napuzba的有用提示!我必须添加到他的建议中的唯一事情是记录对象的一个名为lname
的新属性,并在格式字符串中使用它。
import logging
import foo
class MyFormatter(logging.Formatter):
def __init__(self, fmt=None, datefmt=None, style="%"):
# Calling the constructor of logging.Formatter
super().__init__(fmt, datefmt, style)
def format(self, record):
# This is the only line I added
record.lname = record.__dict__['name'].split(".")[-1]
# Adding lines from logging.Formatter.format(record) here
[...]
logger = logging.getLogger("foo")
handler = logging.StreamHandler()
streamFormat = logging.MyFormatter('[{0}, {1}]: {2}'.format("{lname}", "{levelname}", "{message}"), style='{')
handler.setFormatter(streamFormat)
logger.addHandler(handler)
可以在GitHub上找到遗漏的logging.Formatter.format(record)
行。这只是副本和粘贴,如果有更方便的方法,请告诉我。
答案 0 :(得分:-1)
继承logging.Formatter
并覆盖format(record)
以满足您的需求。
class MyFormatter(logging.Formatter):
def __init__(fmt):
super(fmt)
def format(record):
return "My format" # use record and fmt