首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何配置FastAPI将日志发布到CloudWatch?

如何配置FastAPI将日志发布到CloudWatch?
EN

Stack Overflow用户
提问于 2022-09-07 09:49:08
回答 2查看 320关注 0票数 0

我有一个FastAPI服务,除了日志记录之外,它在各个方面都能正常工作,只有当它作为AWS函数运行时。

在本地运行日志时,将按预期在控制台上显示日志:

代码语言:javascript
复制
INFO:     127.0.0.1:62160 - "POST /api/v1/feature-requests/febbbc21-9650-44e6-8df5-80c8bb33b6ea/upvote HTTP/1.1" 200 OK
INFO:     127.0.0.1:62158 - "OPTIONS /api/v1/feature-requests HTTP/1.1" 200 OK
INFO:     127.0.0.1:62160 - "GET /api/v1/feature-requests HTTP/1.1" 200 OK
INFO:     127.0.0.1:62158 - "OPTIONS /api/v1/feature-requests-meta HTTP/1.1" 200 OK
INFO:     127.0.0.1:62160 - "GET /api/v1/feature-requests-meta HTTP/1.1" 200 OK
INFO:     127.0.0.1:62160 - "GET /api/v1/feature-requests/febbbc21-9650-44e6-8df5-80c8bb33b6ea HTTP/1.1" 200 OK
INFO:     127.0.0.1:62160 - "GET /api/v1/feature-requests-meta/febbbc21-9650-44e6-8df5-80c8bb33b6ea HTTP/1.1" 200 OK

但是,当作为Lambda函数部署时,日志不存在:

代码语言:javascript
复制
2022-09-07T10:44:57.426+02:00   START RequestId: fd44ae47-5bfb-42e3-aeb4-d9f29857bb39 Version: $LATEST
2022-09-07T10:44:57.604+02:00   END RequestId: fd44ae47-5bfb-42e3-aeb4-d9f29857bb39
2022-09-07T10:44:57.604+02:00   REPORT RequestId: fd44ae47-5bfb-42e3-aeb4-d9f29857bb39 Duration: 177.85 ms Billed Duration: 178 ms Memory Size: 2048 MB Max Memory Used: 152 MB Init Duration: 1733.88 ms
2022-09-07T10:45:00.299+02:00   START RequestId: 08a7a6da-c2c6-446c-baa3-1d08c9816f5b Version: $LATEST
2022-09-07T10:45:00.318+02:00   END RequestId: 08a7a6da-c2c6-446c-baa3-1d08c9816f5b

即使对于我们的代码生成的日志(相对于框架),在作为Lambda函数运行时也是不可见的。

配置:

在app.py中

代码语言:javascript
复制
LOG = logging.getLogger()
log_format = "%(asctime)s %(levelname)s %(message)s"
log_date_fmt = "%Y-%m-%d %H:%M:%S"
logging.basicConfig(
    format=log_format,
    level=logging.INFO,
    datefmt=log_date_fmt,
)

在所有其他Python文件中:

代码语言:javascript
复制
LOG = logging.getLogger(__name__)

logging.conf

代码语言:javascript
复制
[loggers]
keys=root,api,config

[handlers]
keys=console_handler

[formatters]
keys=normal_formatter

[logger_root]
level=INFO
handlers=console_handler

[logger_api]
level=INFO
handlers=console_handler
qualname=api
propagate=0

[logger_config]
level=INFO
handlers=console_handler
qualname=config
propagate=0

[handler_console_handler]
class=StreamHandler
level=INFO
formatter=normal_formatter
args=(sys.stdout,)

[formatter_normal_formatter]
format=%(asctime)s %(levelname)s %(name)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

我不确定在CloudWatch中获取日志还需要发生什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-08 06:51:00

如下所示,需要进行以下设置:

在上面的logging.conf顶部,必须导入uvicorn,这将在日志记录上创建一个额外的属性,而不是像这样使用fileConfig:

代码语言:javascript
复制
import uvicorn
logging.config.fileConfig("logging.conf", disable_existing_loggers=False)
LOG = logging.getLogger(__name__)
票数 0
EN

Stack Overflow用户

发布于 2022-09-07 09:54:40

尝试cloudwatch

在控制台中运行pip install cloudwatch

然后在您的代码中:

代码语言:javascript
复制
import logging
from cloudwatch import cloudwatch

logger = logging.getLogger('cloudwatch_logger')
formatter = logging.Formatter('%(asctime)s : %(levelname)s - %(message)s')
handler = cloudwatch.CloudwatchHandler(log_group = 'cloudwatch_log_group')
handler.setFormatter(formatter)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)

然后使用此记录器登录到CloudWatch logger.warning('I am here'),或者通过日志记录配置将处理程序添加到根日志记录器中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73633371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档