如何在单个Python应用程序中分离Google云日志记录中的日志?

2024-10-01 15:48:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个Python3.8.6包,用于在一个计算引擎实例上编排和运行多个任务,这些任务分为多个子包

    package/
        __init__.py
        subpackage1
        subpackage2
        subpackage3

我将日志设置为向云日志提交日志,并导入子包类以在包含入口点(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提交给云日志。一些子包提交了大量日志,因此很难掌握运行的总体情况

我必须如何设置代码以将云日志中的日志分离,例如,划分为不同的日志名


Tags: frompyimportinfopackageinitmainlogging
1条回答
网友
1楼 · 发布于 2024-10-01 15:48:50

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

在主文件(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云日志的单独处理程序。为了实现这一点,我必须使用不同的名称创建一个单独的记录器,并向其附加一个新的处理程序。值得注意的是,python日志记录支持周期分隔的层次结构。这意味着,如果我将脚本2中的package记录器的子记录器命名为package/subpackage2,那么日志将传递给这两个处理程序,从而导致重复的日志提交给Google Cloud logging。但是,在某些情况下,对子对象应用适当的过滤器可能是有意义的。在我的例子中,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.

这个{a2}非常有用

相关问题 更多 >

    热门问题