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!
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?
Não, o valor padrão é sys.stderr
: https://github.com/python/cpython/blob/master/Lib/logging/__init__.py#L955
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.
@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
Comentários muito úteis
Com o arquivo do aplicativo myapp.py , tentei o seguinte.
Posso confirmar que a saída do log de acesso vai para
stdout
.