我正在尝试创建一个集中模块来设置我的日志格式化程序,以便在我的 lambda 函数中的多个 python 模块之间共享。此功能最终将在本地本地设备上的 AWS Greengrass 上运行。
出于某种原因,当我添加自己的处理程序来格式化消息时,日志被输出了两次——一次在正确的日志级别,第二次在不正确的级别。
如果我使用标准的 python 记录器而不设置任何处理程序,它可以正常工作,例如
main.py
:
import logging
logging.debug("test1")
cloudwatch logs
:
12:28:42 [DEBUG]-main.py:38,test1
我的目标是在我的代码上有一个格式化程序,它将这些日志消息格式化为 JSON。然后,它们将被摄取到集中式日志数据库中。但是,当我这样做时,我会收到两次日志消息。
loghelper.py
:
def setup_logging(name):
formatter = logging.Formatter("%(name)s, %(asctime)s, %(message)s")
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(formatter)
logger = logging.getLogger(name)
if logger.handlers:
for handler in logger.handlers:
logger.removeHandler(handler)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
return logger
main.py
:
import logging
logger = loghelper.setup_logging('main.test_function')
def test_function():
logger.debug("test function log statement")
test_function()
现在运行 lambda 函数时,我在云监视日志中收到两次调试消息,如下所示:
cloudwatch logs
:
12:22:53 [DEBUG]-main.py:5, test function log statement
12:22:53 [INFO]-__init__.py:880,main.test_function,2018-06-18 12:22:53,099, test function log statement
请注意:
- 第一个条目的级别正确,但格式错误。
- 第二个条目报告了错误的级别、错误的模块但格式正确。
我无法解释这种行为,并希望对可能导致它的原因有任何想法。我也不知道第 880 行存在哪个构造函数。这可能会对正在发生的事情有所了解。
参考:
设置全局格式化程序: 如何在 python 中为整个程序定义一个记录器?
清除默认 lambda 日志处理程序: 将 python 日志记录与 AWS Lambda 一起使用
创建全局记录器: Python:记录模块 - 全局