【问题标题】:Python add context to logging in a loop [duplicate]Python将上下文添加到循环中的日志记录[重复]
【发布时间】:2019-06-07 03:20:52
【问题描述】:

我正在编写 python 代码以根据后续方法动态添加上下文信息以进行日志记录。 下面是代码

import logging

class AppFilter(logging.Filter):

    def __init__(self,app_name):
        self.app_name=app_name

    def filter(self, record):
        record.app_name = self.app_name
        return True


def custom_log(app):

    logger = logging.getLogger(__name__)

    logger.addFilter(AppFilter(app))

    syslog = logging.StreamHandler()

    formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')

    syslog.setFormatter(formatter)

    logger.setLevel(logging.INFO)

    logger.addHandler(syslog)

    return logger

def stuckTran(app):

    logger=custom_log(app)

    logger.info('The sky is so blue')

    logger.info('hi')

list1=sys.argv[1:]

for a in list1:

    stuckTran(a)

下面是输出:

2019-06-07 08:28:30,761 test1 : 天空好蓝

2019-06-07 08:28:30,761 test1:嗨

2019-06-07 08:28:30,761 test2 : 天空好蓝

2019-06-07 08:28:30,761 test2 : 天空好蓝

2019-06-07 08:28:30,762 test2:嗨

2019-06-07 08:28:30,762 test2:嗨

2019-06-07 08:28:30,762 test3 : 天空好蓝

2019-06-07 08:28:30,762 test3 : 天空好蓝

2019-06-07 08:28:30,762 test3 : 天空好蓝

2019-06-07 08:28:30,762 test3:嗨

2019-06-07 08:28:30,762 test3:嗨

2019-06-07 08:28:30,762 test3:嗨

这里的问题是日志信息被多次打印。我认为问题在于我调用 custom_log 方法的方式。

我已经通过https://docs.python.org/2/howto/logging-cookbook.html#using-filters-to-impart-contextual-information。我还是卡住了

我期待如下输出 python logtest.py test1 test2 test2

2019-06-07 08:28:30,761 test1 : 天空好蓝

2019-06-07 08:28:30,761 test1:嗨

2019-06-07 08:28:30,761 test2 : 天空好蓝

2019-06-07 08:28:30,762 test2:嗨

2019-06-07 08:28:30,762 test3 : 天空好蓝

2019-06-07 08:28:30,762 test3:嗨

我想根据函数参数向日志添加不同的上下文。 请帮忙。

【问题讨论】:

  • @VishnuDasu 这没有回答我的用例
  • 其实这回答了我的问题。谢谢

标签: python logging


【解决方案1】:

logging 是一个 singleton 类,即一次只能有一个实例。因此,每次调用 custom_log() 时,您都不会创建新实例,而是将处理程序添加到 logging 对象。要解决此问题,您可以清除现有的 handlers。修改后的custom_log 函数为:

def custom_log(app):

    logger = logging.getLogger(__name__)

    logger.handlers.clear()

    logger.addFilter(AppFilter(app))

    syslog = logging.StreamHandler()

    formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')

    syslog.setFormatter(formatter)

    logger.setLevel(logging.INFO)

    logger.addHandler(syslog)

    return logger

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多