Gunicorn: Como imprimo o log de acesso ao STDOUT?

Criado em 19 jan. 2016  ·  22Comentários  ·  Fonte: benoitc/gunicorn

Oi,

http://docs.gunicorn.org/en/stable/settings.html#accesslog está me dizendo que '-' será enviado para stderr, mas preferimos STDOUT para fins de registro. Existe uma maneira de fazer isso?

Obrigado!

Documentation FeaturLogging

Comentários muito úteis

Com o arquivo do aplicativo myapp.py , tentei o seguinte.

$ python --version
Python 3.5.2
$ gunicorn --version
gunicorn (version 19.7.0)
$ gunicorn --access-logfile - myapp:app 

Posso confirmar que a saída do log de acesso vai para stdout .

Todos 22 comentários

A linha relevante está aqui: https://github.com/benoitc/gunicorn/blame/master/gunicorn/glogging.py#L335 logging.StreamHandler() defaults to sys.stderr . Talvez possamos alterar o accesslog para aceitar "stdout" e "stderr" como valores válidos e passar para logging.StreamHandler() .

Outra solução menos flexível:

O manipulador do console já imprime para sys.stdout : https://github.com/benoitc/gunicorn/blob/master/gunicorn/glogging.py#L64 Podemos definir o manipulador para "console" para gunicorn.accesslog como já fizemos por gunicorn.error em https://github.com/benoitc/gunicorn/blob/master/gunicorn/glogging.py#L55

Estou confuso. O StreamHandler já não faz logon no sys.stdout?

OK, eu entendo agora. Originalmente, estávamos imprimindo logs para stdout. IMO o log de acesso deve padronizar para STDOUT. Pensamentos?

@benoitc :+1:

Log de acesso no stdout
Erro ao logar no stderr

alguma atualização sobre este pedido?

@benoitc Não tenho certeza se este commit aborda esse problema. Digamos que eu execute gunicorn myapp:app sem argumentos adicionais. A expectativa é que o gunicorn registre os registros de acesso na saída padrão? Se sim, gunicorn não faz isso.

Em https://github.com/benoitc/gunicorn/blob/master/gunicorn/glogging.py#L302 sem nenhum argumento de linha de comando self.cfg.accesslog é None e a função retorna mais cedo. Até onde eu sei, parece não haver como fazer login no stdout sem especificar --log-config ou --log-syslog . Isso está correto?

por padrão o log de acesso está desabilitado se é isso que você quer dizer?

@benoitc Sim. A discussão acima parece indicar que os logs de acesso irão para stdout e os logs de erros para stderr. No entanto, parece que o log de acesso está desabilitado por padrão.

BTW, com o Python 2.7 eu costumava ser capaz de fazer --access-log /dev/stdout --error-log /dev/stderr e isso funcionaria. Com o Python 3, passar /dev/stdout como um argumento falha em https://github.com/benoitc/gunicorn/blob/f722a6eb65e51407c420ac3d6be72d03bd773ad0/gunicorn/util.py#L498

👍 @suriya Acho que estou procurando o mesmo comportamento que você -- gostaria de executar --capture-log e habilitar --access-logfile=<something> , mas prefiro que minhas linhas de log de acesso fossem para stdout não stderr.

EDIT: Para esclarecer, isso parece ser apenas um problema com o Python3. Usando python3.5.1, passar --access-logfile=/dev/stdout para gunicorn falha ao iniciar o servidor.

Sim, parece que o log de acesso está desabilitado por padrão.

@huoxy Mais do que o padrão, acho que o problema é mais que não há uma maneira simples de gravar logs de acesso na saída padrão.

@huoxy ˋ--access-logfile=-` deve fazer o truque. deixe-me saber se não.

  • benoît
    Na quarta-feira, 27 de julho de 2016 às 08:49, Suriya Subramanian [email protected]
    escreveu:

@huoxy https://github.com/huoxy Mais do que o padrão, eu acho
o problema é que não há uma maneira simples de gravar logs de acesso para
saída padrão.


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/benoitc/gunicorn/issues/1184#issuecomment -235501347,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AAA4oj67GbLqwaJaCQ9NOH7-iAXJoMxGks5qZv9fgaJpZM4HHW4G
.

também é provavelmente um problema doc. mas o log de acesso deve ser impresso para stdout
quando - é usado. caso contrário, é um bug. Avise...
Em qua, 27 jul 2016 at 09:03, Benoit Chesneau [email protected] escreveu:

@huoxy ˋ--access-logfile=-` deve fazer o truque. deixe-me saber se não.

  • benoît
    Na quarta-feira, 27 de julho de 2016 às 08:49, Suriya Subramanian [email protected]
    escreveu:

@huoxy https://github.com/huoxy Mais do que o padrão, eu acho
o problema é que não há uma maneira simples de gravar logs de acesso para
saída padrão.


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/benoitc/gunicorn/issues/1184#issuecomment -235501347,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AAA4oj67GbLqwaJaCQ9NOH7-iAXJoMxGks5qZv9fgaJpZM4HHW4G
.

@benoitc Conforme mencionado em #1293, gunicorn --access-log - registra acessos ao erro padrão. Eu tentei com gunicorn --access-log=- e o log ainda vai para o erro padrão.

de acordo com isso:
https://github.com/gunicorn/gunicorn/blob/master/gunicorn/glogging.py#L58

logger padrão é console que sai para stdout, então eu acho que se você precisa de tudo para stdout como eu, para que tudo chegue ao driver de log do gunicorn, você pode simplesmente deixar essas opções em branco.

Além disso, a solução que eu sugiro é criar um link simbólico para os arquivos de log para /dev/stdout ou /dev/stderror se não funcionar diretamente:

ln -sf /var/log/gunicorn.access.log  /dev/stdout
ln -sf /var/log/gunicorn.error.log  /dev/stdout

exec newrelic-admin run-program gunicorn --chdir /usr/src/app --name nexchange --bind 0.0.0.0:${GUNICORN_PORT} --workers 3 --log-level=info --log-file=/var/log/gunicorn.error.log --access-logfile=/var/log/gunicorn.access.log nexchange.wsgi:application "$@"

Acabei de mudar para o gunicorn 19.7.0 lançado na semana passada. Infelizmente, ainda não consigo gravar o log de acesso em nada além de stderr.

Eu tentei executar o gunicorn sem opções e também com todas as permutações de incluir/não incluir "--access-logfile=- --error-logfile=- --log-level=DEBUG".

Estou perdendo algo básico sobre o registro de gunicorn? É algo do meu ambiente ou do Django possivelmente sangrando e causando esse problema?

Com o arquivo do aplicativo myapp.py , tentei o seguinte.

$ python --version
Python 3.5.2
$ gunicorn --version
gunicorn (version 19.7.0)
$ gunicorn --access-logfile - myapp:app 

Posso confirmar que a saída do log de acesso vai para stdout .

Estou no Python 2.7.14. (De alguma forma, perdi a resposta rápida meses atrás.)

Você também pode usar accesslog = "-" em seu gunicorn.config.py

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