Невозможно получить журналы приложений в файле журнала доступа Gunicorn - PullRequest
1 голос
/ 09 июля 2020

Вот конфигурационный файл Gunicorn:

import multiprocessing
certfile="domain.crt"
keyfile="server.key"
bind = "0.0.0.0:8443"
workers = multiprocessing.cpu_count() * 2 + 1
threads = 2
timeout = 300
graceful_timeout = 300
accesslog = "-"
errorlog = "-"
loglevel = "INFO"

Согласно документации Gunicorn (https://docs.gunicorn.org/en/stable/settings.html#accesslog), если вы установите

  1. значение "accesslog" как «-», то все журналы доступа к Gunicorn будут go на стандартный вывод.
  2. значение «errorlog» как «-», тогда все журналы ошибок Gunicorn будут go на stderr.

Теперь я хочу, чтобы журналы моих приложений сохранялись в том же месте, что и журналы стрельбы. Поэтому я хочу, чтобы мои журналы приложений на данный момент были go в стандартный вывод (потому что в конфигурации gunicorn значение "accesslog" установлено как "-", что означает стандартный вывод).

Вот текущий код приложения:

from flask import Flask, jsonify

app = Flask(__name__)

if __name__ != '__main__':
    gunicorn_logger = logging.getLogger('gunicorn.error')
    logging.basicConfig(format=LOGGING_FORMAT, datefmt=DATE_FORMAT, level=gunicorn_logger.level)

@app.route('/')
def default_route():
    """Default route"""
    app.logger.debug('this is a DEBUG message')
    app.logger.info('this is an INFO message')
    app.logger.warning('this is a WARNING message')
    app.logger.error('this is an ERROR message')
    app.logger.critical('this is a CRITICAL message')
    return jsonify('hello world')

(скопировано из https://trstringer.com/logging-flask-gunicorn-the-manageable-way/)

Но вот проблема:

  1. Все эти журналы приложений вместо этого перенаправляются на stderr из stdout.
  2. Я получаю только журналы доступа gunicorn на stdout, хотя я должен также получить журналы приложений.

Как решить эту проблему? Какие изменения внести в код приложения? Есть хакерское исправление, которое работает, но я ищу лучшие решения. Хакерское исправление ( Регистрация стандартного вывода в журнал доступа к стрельбе? ): В коде приложения я могу настроить регистратор как:

gunicorn_logger = logging.getLogger('gunicorn.error')
logging.basicConfig(format=LOGGING_FORMAT, datefmt=DATE_FORMAT, level=gunicorn_logger.level, stream=sys.stdout)

Кажется, это перенаправляет журналы моего приложения на стандартный вывод, но это решение похоже на жесткое кодирование значения потока. Я хочу, чтобы он был связан с конфигурацией gunicorn, так что если в будущем я захочу получить все журналы в файл, я могу просто go и изменить его в файле конфигурации gunicorn вместо того, чтобы заходить в код приложения.

...