繁体   English   中英

没有使用 watchtower 将正确的日志记录(python)格式发送到 Cloudwatch

[英]Correct logging(python) format is not being sent to Cloudwatch using watchtower

我编写了以下代码来启用 Cloudwatch 支持。

import logging
from boto3.session import Session
from watchtower import CloudWatchLogHandler

logging.basicConfig(level=logging.INFO,format='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s]  %(message)s',datefmt='%d/%b/%Y %H:%M:%S')
log = logging.getLogger('Test')

boto3_session = Session(aws_access_key_id=AWS_ACCESS_KEY_ID,
                aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                region_name=REGION_NAME)

cw_handler = CloudWatchLogHandler(log_group=CLOUDWATCH_LOG_GROUP_NAME,stream_name=CLOUDWATCH_LOG_STREAM_NAME,boto3_session=boto3_session)
log.addHandler(cw_handler)

每当我尝试打印任何记录器语句时,我都会在本地系统和 cloudwatch 上得到不同的输出。

例子:

log.info("Hello world")

上述记录器语句在我的本地系统(终端)上的输出:

[24/Feb/2019 15:25:06.969] [Test,<module>:1] [INFO]  Hello world

cloudwatch 上的上述记录器语句的输出(日志流):

Hello world

有什么我想念的吗?

在 Lambda 执行环境中,已经预先配置了根记录器。 您必须使用它或解决它。 您可以执行以下一些操作:

您可以直接在根记录器上设置格式:

root = logging.getLogger()
root.setLevel(logging.INFO)
root.handlers[0].setFormatter(logging.Formatter(fmt='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s]  %(message)s', datefmt='%d/%b/%Y %H:%M:%S'))

您可以向其中添加 Watchtower 处理程序(免责声明:我没有尝试过这种方法):

root = logging.getLogger()
root.addHandler(cw_handler)

但是,我想知道您是否甚至需要使用 Watchtower。 在 Lambda 中,您打印到stdout每一行(因此即使只是使用print )都会记录到 Cloudwatch。 因此,使用标准logging界面可能就足够了。

这对我有用

import logging
import watchtower
watch = watchtower.CloudWatchLogHandler()
watch.setFormatter(fmt = logging.Formatter('%(levelname)s - %(module)s - %(message)s'))
logger = logging.getLogger()
logger.addHandler(watch)

根据https://stackoverflow.com/a/45624044/1021819中的评论(以及那里的另一个答案),

只需将force=True添加到logging.basicConfig() ,因此在您的情况下您需要

logging.basicConfig(level=logging.INFO, force=True, format='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s]  %(message)s',datefmt='%d/%b/%Y %H:%M:%S')
log = logging.getLogger('Test')

如果根记录器已经配置了处理程序,则此函数不执行任何操作,除非关键字参数 force 设置为 True。

(即AWS案例)

回复:力量:

如果此关键字参数指定为 true,则在执行其他参数指定的配置之前,将删除并关闭附加到根记录器的任何现有处理程序。

参考: https ://docs.python.org/3/library/logging.html#logging.basicConfig

谢谢:

https://stackoverflow.com/a/72054516/1021819

https://stackoverflow.com/a/45624044/1021819

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM