Python 3日志记录 - 是否可以拆分模块名称?

时间:2017-04-25 16:33:30

标签: python logging formatting

是否可以在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)行。这只是副本和粘贴,如果有更方便的方法,请告诉我。

1 个答案:

答案 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