uvicorn 为 gelf 驱动程序抑制 python 的系统日志

问题描述

我有一个 docker 容器,通过 udp 使用 gelf 运行日志记录到日志记录实例 - 一切正常!

容器基于 Ubuntu 18,其中 rsyslog 作为服务运行,运行良好。

容器内部是一个 FastAPI 应用程序,它与 uvicorn 网络服务器一起运行。它也完美地工作,并且 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? 我需要了解关于 syslog 的 uvicorn 什么? 或者我能做什么?

谢谢

解决方法

该问题是由 gelf 忽略系统日志造成的。但是,python 中的简单打印将被识别。

解决方案:我在 python 中为自己构建了一个日志函数,它将记录到 syslog 并打印出我想记录的任何内容。