【问题标题】:How can I separate logs in Google Cloud Logging within a single Python application?如何在单个 Python 应用程序中分离 Google Cloud Logging 中的日志?
【发布时间】:2021-11-20 08:19:08
【问题描述】:

我编写了一个 Python 3.8.6 包,用于在 Compute Engine 实例上编排和运行多个任务,分为多个子包。

    package/
        __init__.py
        subpackage1
        subpackage2
        subpackage3

我设置了日志记录以将日志提交到 Cloud Logging 并导入子包类以在包含入口点 (package/__init__.py) 的文件中完成它们的工作。

import logging as pylogging
from google.cloud import logging
from google.cloud.logging.handlers import CloudLoggingHandler

from package.subpackage1.script1 import Class1
from package.subpackage2.script2 import Class2
from package.subpackage3.script3 import Class3

pylogging.basicConfig(level=20)
LOGGER = pylogging.getLogger()


def main():
    log_client = logging.Client()
    handler = CloudLoggingHandler(log_client, name="package")
    LOGGER.addHandler(handler)

    LOGGER.info("Starting work")

    Class1()
    Class2()
    Class3()

    LOGGER.info("Finished work")


if __name__ == '__main__':
    main()

要从我导入的子包中进行日志记录,并以类似方式设置日志记录。

import logging as pylogging

pylogging.basicConfig(level=20)
LOGGER = pylogging.getLogger()


class Class1:

    def __init__(self):
        LOGGER.info("Work Class1")

日志以相同的日志名称“package”see here 提交到 Cloud Logging。一些子包会提交大量的日志,因此一般很难把握运行的大局。

如何设置我的代码以将 Cloud Logging 中的日志分隔为不同的日志名称?

【问题讨论】:

  • 为什么不使用多个处理程序?
  • 我尝试这样做,但随后多次提交日志,并在 Cloud Logging 中搞砸了。也许我做错了……如何正确使用多个处理程序?

标签: python logging google-cloud-platform google-compute-engine google-cloud-logging


【解决方案1】:

我今天花了一些时间,终于找到了答案。

在主文件(package/__init__.py)中,我需要为记录器设置一个特定的名称,否则将使用根记录器。我还添加了一些调试消息来演示和尝试不同的日志级别。主文件现在看起来像这样:

import logging as pylogging
from google.cloud import logging
from google.cloud.logging.handlers import CloudLoggingHandler

from package.subpackage1.script1 import Class1
from package.subpackage2.script2 import Class2
from package.subpackage3.script3 import Class3

pylogging.basicConfig(level=20)
LOGGER = pylogging.getLogger("package")


def main():
    log_client = logging.Client()
    handler = CloudLoggingHandler(log_client, name="package")
    LOGGER.addHandler(handler)

    LOGGER.info("Starting work")

    LOGGER.debug("Class 1")
    Class1()
    LOGGER.debug("Class 2")
    Class2()
    LOGGER.debug("Class 3")
    Class3()

    LOGGER.info("Finished work")


if __name__ == '__main__':
    main()

在子模块中,我不必一遍又一遍地设置 basicConfig,因为在此处更改它会导致不必要的副作用。此外,我必须使用与package/__init__.py 中设置的记录器名称相同的记录器名称,以使用相同的设置并通过定义的处理程序将日志发送到 Google Cloud Logging。 package/subpackage1/script1.py 现在看起来像这样:

import logging as pylogging

LOGGER = pylogging.getLogger("package")


class Class1:

    def __init__(self):
        LOGGER.debug("Inside Class1")
        LOGGER.info("Work Class1")

现在,我想将日志(例如,不同级别的日志)发送到 Google Cloud 日志记录的单独处理程序。为此,我必须创建一个具有不同名称的单独记录器并为其附加一个新的处理程序。值得注意的是,python 日志记录支持以句点分隔的层次结构。这意味着,如果我通过将其命名为 package/subpackage2 在 script2 中创建 package 记录器的子记录器,则日志将被传递给两个处理程序,因此会导致重复提交到 Google Cloud 日志记录。但是,在某些情况下,通过对孩子应用适当的过滤器可能是有意义的。在我的例子中,package/subpackage2/script2.py 看起来像这样:

import logging as pylogging
from google.cloud import logging
from google.cloud.logging.handlers import CloudLoggingHandler

LOGGER = pylogging.getLogger("subpackage2")
LOGGER.setLevel(10)
log_client = logging.Client()
handler = CloudLoggingHandler(log_client, name="subpackage2")
LOGGER.addHandler(handler)

class Class2:

    def __init__(self):
        LOGGER.debug("Inside Class2")
        LOGGER.info("Work Class2")

这会通过不同的处理程序将日志发送到 Google Cloud Logging 中的不同日志名称,即使在这种情况下修改了日志级别也是如此。 This is how it looks in Google Cloud Logging.

这个Python logging documentation 很有帮助。

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 2020-07-07
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2021-11-14
    • 2016-12-19
    相关资源
    最近更新 更多