如何在单个Python应用程序中分离Google Cloud Logging中的日志?



我编写了一个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"提交给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("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中设置的相同的日志记录器名称来使用相同的设置,并通过定义的处理程序将日志发送到谷歌云日志。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")

现在,我想发送日志,例如,不同级别的日志,到一个单独的处理程序到谷歌云日志。要实现这一点,我必须创建一个具有不同名称的单独记录器,并为其附加一个新的处理程序。值得注意的是,python日志记录支持周期分隔的层次结构。这意味着,如果我在script2中创建package日志记录器的子日志记录器,并将其命名为package/subpackage2,日志将被传递给两个处理程序,因此,将导致副本提交给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中的不同日志名称,即使在这种情况下修改了日志级别。这是它在Google Cloud Logging中的样子。

这个Python日志文档非常有帮助。

相关内容

最新更新