uvicorn 抑制了 gelf 驱动程序的 python 系统日志
Posted
技术标签:
【中文标题】uvicorn 抑制了 gelf 驱动程序的 python 系统日志【英文标题】:uvicorn suppresses python's syslog for gelf driver 【发布时间】:2020-12-23 17:55:15 【问题描述】:我有一个 docker 容器 正在使用 gelf 通过 udp 将日志记录到日志实例——一切正常!
容器基于 Ubuntu 18,其中 rsyslog 作为服务运行,运行良好。
容器内部是一个运行于 uvicorn 网络服务器的 FastAPI 应用程序。它也可以完美运行,并且 uvicorn 可以完美地记录到日志实例。
这里有什么不起作用,但通常适用于非 FastAPI python 项目。我使用 python 的 syslog 来记录更多的东西。
带有 syslog 的应用看起来是这样的(我创建了一个简单的示例供自己调试):
from fastapi import FastAPI
import syslog
syslog.openlog(facility=syslog.LOG_LOCAL0)
app = FastAPI()
syslog.syslog(syslog.LOG_INFO, 'startup done')
@app.get("/")
async def root():
syslog.syslog(syslog.LOG_INFO, 'get hello')
return "message": "Hello World"
日志实例的日志不显示系统日志消息。只有 uvicorn 的消息:
INFO: Started server process [21]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
INFO: 172.17.0.1:35346 - "GET / HTTP/1.1" 200 OK
为了进一步调试,我检查了 rsyslog 的日志文件,它包含 syslog 消息:
Dec 23 17:21:39 /uvicorn: startup done
Dec 23 17:21:50 /uvicorn: get hello
这是 /etc/rsyslog.d 中的 rsyslog 配置
local0.*
action(type="omfile" file="/var/log/test.log" fileOwner="syslog" fileGroup="syslog" fileCreateMode="0640")
stop
我在这里缺少什么? 为什么gelf忽略rsyslog? 关于 uvicorn 关于 syslog,我需要了解什么? 或者我该怎么办?
谢谢
【问题讨论】:
【参考方案1】:问题是由于 gelf 忽略了 syslog。不过,python 中的简单打印将被识别。
解决方案:我自己在 python 中构建了一个日志函数,它将记录到 syslog 并打印出我想要记录的任何内容。
【讨论】:
以上是关于uvicorn 抑制了 gelf 驱动程序的 python 系统日志的主要内容,如果未能解决你的问题,请参考以下文章
使用 websockets 优雅关闭 uvicorn starlette 应用程序
有没有办法为 Starlette/Uvicorn 显式设置 MIME 类型?
如何使用 Uvicorn 和 asyncio.create_task() 将任务置于后台?