[英]How can I get the user's IP-Address in my Cloud-Run Flask app?
[英]How can I get Google Cloud Logging to show my flask + gunicorn app's logs with the correct alert level?
我有一个用 python 编写的 GCP Cloud Run 服务,它使用 Flask 提供 API。 API 使用 gunicorn 在 docker 容器中运行,如下所示:
CMD exec gunicorn --bind :$PORT --workers 8 --threads 8 --timeout 0 --log-level=info main:app
然后将该容器部署到 Cloud Run。 在 API 中,我使用 Flask 的内置记录器记录消息,如下所示:
app.logger.critical("Example message")
我已经按照 GCP 文档的建议设置了谷歌云客户端库,如下所示:
logging_client = google.cloud.logging.Client()
logging_handler = logging_client.setup_logging()
我在main.py
中创建 flask 应用程序之前执行此操作。 具体来说:
logging_client = google.cloud.logging.Client()
logging_handler = logging_client.setup_logging()
dictConfig(
{
"version": 1,
"formatters": {
"default": {
"format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s",
}
},
"handlers": {
"wsgi": {
"class": "logging.StreamHandler",
"stream": "ext://flask.logging.wsgi_errors_stream",
"formatter": "default",
},
"gcp_logging": {
"class": "google.cloud.logging.handlers.CloudLoggingHandler",
"client": logging_client,
},
},
"root": {"level": "INFO", "handlers": ["wsgi", "gcp_logging"]},
}
)
app = Flask(__name__)
当我在 Cloud Run 中运行服务时,会显示日志消息,但警报级别为空。
如何配置 flask + gunicorn + GCP 云日志记录,以便我的日志消息在日志控制台中显示时显示正确的日志级别?
您可能会遇到正在使用的处理程序的问题。 您调用logging_client.setup_logging()
,它应该根据代码运行的环境自动配置处理程序,但是您似乎也在dictConfig
中手动设置新的处理程序。
严重性不正确的日志可能来自StreamHandler
。 Cloud Run 将自动从环境中捕获标准输出日志,但内置StreamHandler
无法正确格式化日志,以便自动捕获严重性等元数据。 您附加的CloudLoggingHandler
应该显示正确的严重性,但它在无服务器环境中可能会出现问题,因为它会尝试通过网络批量发送日志。 当环境停止运行时,未发送的日志批次可能会丢失。
相反,我们建议使用StructuredLogHandler
,它将日志作为结构化 JSON 输出到 stdout,然后由 GCP 代理捕获并发送到 Cloud Logging。 如果您运行logging_client.setup_logging()
而不覆盖处理程序,则应该自动为您设置它。
可以在此 GitHUb 线程和库文档中找到更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.