【问题标题】:Python logging: left align with bracketsPython日志记录:左对齐括号
【发布时间】:2020-01-15 11:09:45
【问题描述】:

我想用括号格式化记录器并将文本左对齐。

formatter = logging.Formatter('[%(asctime)s] [%(levelname)-8s] [%(funcName)-12s]   %(message)s')

这是结果

[2019-09-13 16:22:56,050] [INFO    ] [main        ]   Message 1
[2019-09-13 16:22:56,050] [DEBUG   ] [do_debug    ]   Message 2
[2019-09-13 16:22:56,050] [WARNING ] [do_warning  ]   Message 3

但我想得到这样的东西

[2019-09-13 16:22:56,050] [INFO]     [main]           Message 1
[2019-09-13 16:22:56,050] [DEBUG]    [do_debug]       Message 2
[2019-09-13 16:22:56,050] [WARNING]  [do_warning]     Message 3

【问题讨论】:

    标签: python logging formatting brackets leftalign


    【解决方案1】:

    这很容易做到,如下例所示:

    import logging
    
    logger = logging.getLogger(__name__)
    
    def do_debug():
        logger.debug('Message 2')
    
    def do_warning():
        logger.warning('Message 3')
    
    def main():
        logger.info('Message 1')
        do_debug()
        do_warning()
    
    def fmt_filter(record):
        record.levelname = '[%s]' % record.levelname
        record.funcName = '[%s]' % record.funcName
        return True
    
    if __name__ == '__main__':
        FMT = '[%(asctime)s] %(levelname)-10s %(funcName)-12s   %(message)s'
        f = logging.Formatter(FMT)
        h = logging.StreamHandler()
        h.setFormatter(f)
        logger.setLevel(logging.DEBUG)
        logger.addHandler(h)
        logger.addFilter(fmt_filter)
        main()
    

    运行时,上面的脚本打印:

    [2020-02-01 21:36:48,758] [INFO]     [main]         Message 1
    [2020-02-01 21:36:48,758] [DEBUG]    [do_debug]     Message 2
    [2020-02-01 21:36:48,774] [WARNING]  [do_warning]   Message 3
    

    您应该能够根据您的特定需求调整上述示例,例如你在哪里应用过滤器,你使用什么处理程序,等等。

    【讨论】:

    • 这在我个人情况下有效,但仅当我将过滤器应用于处理程序(StreamHandler)而不是记录器本身时。
    • @jonathan 是的,精确部署取决于确切的需求,但使用过滤器的原则是关键。如果有多个记录器使用处理程序,则在处理程序上设置过滤器是正确的做法,但为了清楚起见,我想用一个最小的例子来说明。
    • 是的,解决方案非常完美。只是等待超时奖励赏金。谢谢,维奈。出于兴趣,在调用 super() 之后不使用 attr 修改覆盖 Filter 类是否有任何好处/损失?
    • 虽然可以继承 Filter,这最初是进行自定义过滤的唯一方法,但在某些时候,我添加了仅使用可调用来过滤的功能 - 减少您必须做的工作做!但它同样适用于 Filter 子类和重写的 filter() 方法。
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 2013-11-24
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多