Gunicorn: Mensagens de log do app.logger do Flask

Criado em 19 jul. 2012  ·  11Comentários  ·  Fonte: benoitc/gunicorn

Mensagens do registrador do Flask, como app.logger.info("Esta é uma mensagem") não são salvas nos arquivos de log do gunicorn.

Comentários muito úteis

O Flask não registra mensagens no modo de produção por padrão porque não faz suposições sobre seu ambiente (http://flask.pocoo.org/docs/errorhandling/). Para que o app.logger do Flask registre mensagens via gunicorn, você terá que adicionar um manipulador de registro. Por exemplo, aqui está um logger para o stderr do gunicorn:

import logging
import flask

app = flask.Flask(__name__)

@app.before_first_request
def setup_logging():
    if not app.debug:
        # In production mode, add log handler to sys.stderr.
        app.logger.addHandler(logging.StreamHandler())
        app.logger.setLevel(logging.INFO)

Este não é um problema com o gunicorn e pode ser fechado.

Todos 11 comentários

O Flask não registra mensagens no modo de produção por padrão porque não faz suposições sobre seu ambiente (http://flask.pocoo.org/docs/errorhandling/). Para que o app.logger do Flask registre mensagens via gunicorn, você terá que adicionar um manipulador de registro. Por exemplo, aqui está um logger para o stderr do gunicorn:

import logging
import flask

app = flask.Flask(__name__)

@app.before_first_request
def setup_logging():
    if not app.debug:
        # In production mode, add log handler to sys.stderr.
        app.logger.addHandler(logging.StreamHandler())
        app.logger.setLevel(logging.INFO)

Este não é um problema com o gunicorn e pode ser fechado.

fechado por solicitação. Obrigado!

O gunicorn pega automaticamente o log do STDERR?

@benoitc
Como forço o gunicorn a pegar o log do STDERR?

O sinalizador -R pode ser o que você está procurando.

http://gunicorn-docs.readthedocs.org/en/latest/settings.html#enable -stdio-inheritance

-R não fez isso por mim.

Abaixo está minha configuração

@app.route('/')
def index():
    console = logging.StreamHandler()
    log = logging.getLogger("asdasd")
    log.addHandler(console)
    log.setLevel(logging.DEBUG)
    log.error("Something")
    print >> sys.stderr, "Another thing"
    return 'ok'

Aqui está como eu executo

gunicorn --access-logfile - --log-file /mnt/log/test.log --bind 0.0.0.0:8080 --workers 2 --worker-class gevent --log-level -D debug server:app

Eu recebo os logs do gunicorn em /mnt/log/test.log, mas nenhum dos meus logs de aplicativos.

OK. Posso não entender como isso funciona, a menos que seja uma simples questão de
ter que liberar o stderr manualmente (IIRC isso ocorre porque ele fica armazenado em buffer
quando garfos de gunicorn, talvez?)

Mas é definitivamente muito mais fácil controlar para onde vão suas mensagens de log se
você usa os loggers python em vez de stdio.
Em 26 de junho de 2014, 13h39, "Yousuf Fauzan" [email protected] escreveu:

-R não fez isso por mim.

Abaixo está minha configuração

@app.route('/')
def índice():
console = logging.StreamHandler()
log = logging.getLogger("asdasd")
log.addHandler(console)
log.setLevel(log.DEBUG)
log.error("Algo")
print >> sys.stderr, "Outra coisa"
retorne 'ok'

Aqui está como eu executo

gunicorn --access-logfile - --log-file /mnt/log/test.log --bind 0.0.0.0:8080 --workers 2 --worker-class gevent --log-level debug server:app

Recebo os logs do gunicorn em /mnt/log/test.log, mas nenhum do meu aplicativo
Histórico.


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/benoitc/gunicorn/issues/379#issuecomment -47276949.

Acho que encontrei o problema. Aqui está uma entrada no changelog para 19.00

fix logging: don’t try to redirect stdout/stderr to the logfile.

Acabei de tentar com a v18 e os logs do StreamHandler estão sendo roteados para os logs do gunicorn. Alguma idéia de como corrigir isso?
@benoitc @tilgovi

@spicavigo gunicorn não redirecionará o stderr para o arquivo de log automaticamente. A correção foi remover o hack como foi discutido em #591 . Você tentou --error-logfile=- que exibe os logs no console?

Se você quiser retornar o erro diretamente para o arquivo de erro, você pode eventualmente imprimir para environ['wsgi.errors'] ou registrá-lo: ee08ac86441e36c3433849b79b3839d1425647fd .

Obrigado @benoitc

Agora estou logando em um arquivo em vez de stderr. É só que a mudança aconteceu entre o meu dev e por isso me fez tropeçar totalmente. Eu estava pip install gunicorn e de repente o redirecionamento stderr parou de funcionar e eu não percebi que era por causa da mudança de versão e não devido a bugs no meu código :)

@benoitc Ainda é possível registrar stderr no arquivo de log de alguma forma?

Esta página foi útil?
0 / 5 - 0 avaliações