uvicorn подавляет системный журнал python для драйвера gelf

#python #docker #syslog #uvicorn #gelf

#python #docker #системный журнал #uvicorn #gelf

Вопрос:

У меня есть контейнер docker, в котором выполняется ведение журнала с помощью gelf в экземпляр журнала через udp — все в порядке!

Контейнер основан на Ubuntu 18, где rsyslog работает как служба, которая работает хорошо.

Внутри контейнера находится приложение FastAPI, работающее с веб-сервером uvicorn. Он также отлично работает, и uvicorn отлично регистрируется в экземпляре журнала.

Здесь происходит то, что не работает, но обычно работает с проектами python, отличными от FastAPI. Я использую системный журнал python для регистрации большего количества материалов.

Приложение с системным журналом выглядит следующим образом (я создал простой пример для отладки для себя):

 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"}
 

Журналы в экземпляре logging не отображают сообщения системного журнала. Только сообщения 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, и он содержит сообщения системного журнала:

 Dec 23 17:21:39 /uvicorn: startup done
Dec 23 17:21:50 /uvicorn: get hello
 

и вот конфигурация rsyslog в /etc/rsyslog.d

 local0.* {
   action(type="omfile" file="/var/log/test.log" fileOwner="syslog" fileGroup="syslog" fileCreateMode="0640")
   stop
}
 

Чего мне здесь не хватает?
Почему gelf игнорирует rsyslog?
Что мне нужно понять об uvicorn в отношении системного журнала?
или что я могу сделать?

Спасибо

Ответ №1:

Проблема возникает из-за того, что gelf игнорирует системный журнал. Однако простая печать на python будет распознана.

Решение: я создал себе функцию журнала в python, которая будет регистрироваться в системном журнале и распечатывать все, что я хочу зарегистрировать.