【问题标题】:Python: Why is it sending duplicate logs to Stackdriver?Python:为什么它向 Stackdriver 发送重复的日志?
【发布时间】:2020-11-25 21:29:36
【问题描述】:

我将从我的数据管道生成的日志发送到 GCP 上的 Stackdriver。但由于某种原因,它发送了相同事件日志的多个副本。在我的ensure_stackdriver_logging 函数中,我检查处理程序是否已经存在,以防止如果重新运行task,处理程序将不会被多次添加。有谁知道是什么问题?

def ensure_stackdriver_logging():
    logger = get_logger()
    lg_client = google.cloud.logging.Client()
    lg_handler = CloudLoggingHandler(lg_client, 'thinknum_etl_logging')
    if lg_handler not in logger.handlers:
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        lg_handler.setFormatter(formatter)
        logger.setLevel(logging.INFO)
        logger.addHandler(lg_handler)


def task():
    ensure_stackdriver_logging()
    ...

更新:

我也试过了--

def ensure_stackdriver_logging():
    logger = get_logger()

    if hasattr(logger, 'initialized'):
        return logger
    else:
        setattr(logger, 'initialized', True)

    lg_client = google.cloud.logging.Client()
    lg_handler = CloudLoggingHandler(lg_client, 'thinknum_etl_logging')
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    lg_handler.setFormatter(formatter)
    logger.setLevel(logging.INFO)
    logger.addHandler(lg_handler)

但是没有用。

【问题讨论】:

    标签: python logging google-cloud-platform stackdriver google-cloud-logging


    【解决方案1】:

    如果您在其他地方调用 ensure_stackdriver_logging() 方法,甚至之前添加了一个记录器处理程序,它会发生两次(或更多),因为您的 if 检查没有按预期工作。

    当您进行if lg_handler not in logger.handlers: 检查时,比较发生在lg_handler 对象ID 和列表中的其他对象之间,但是因为您刚刚在列表之前的行中创建了lg_handler,它不会在列表中。

    以此为例:

    class Foo():
        pass
    
    l = [Foo()]
    b = Foo()
    print(b in l)
    >>> False
    

    b 不在列表中,因为b 指向的对象不在列表中,而是具有相同值的Foo 对象。

    【讨论】:

    • 谢谢 - 这是有道理的。那么如何检查已经与其他处理程序一起预配置的记录器的处理程序是否存在?在这种情况下,我想检查 GCP Stackdriver 处理程序
    • @RileyHun 您可能应该实现处理程序的__eq__ 函数,该函数将通过比较它们的字段来检查处理程序的两个实例是否相同。当您实现该功能时,它也将与问题中的代码一起使用,因为 in 运算符将尝试使用您的 __eq__ 实现。
    • 我尝试过使用 hasattr 和 setattr 但也没有用。
    • @RileyHun 您能附上您尝试使用的代码吗?
    猜你喜欢
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多