Tenha o nginx access_log e error_log para STDOUT e STDERR do processo mestre

136

Existe uma maneira de fazer com que o processo mestre faça logon no STDOUT STDERR em vez de em um arquivo?

Parece que você só pode passar um caminho de arquivo para a diretiva access_log:

access_log  /var/log/nginx/access.log

E o mesmo vale para error_log:

error_log /var/log/nginx/error.log

Entendo que isso simplesmente pode não ser um recurso do nginx, eu estaria interessado em uma solução concisa que usa tail, por exemplo. É preferível, porém, que seja proveniente do processo mestre, porque estou executando o nginx em primeiro plano.

Quinn
fonte
14
Usando o Nginx dentro de um contêiner do Docker? Faça o checkout desta resposta .
czerasz
A resposta aceita (Patrick's) funciona para imagens oficiais do Nginx Docker (hub.docker.com/_/nginx).
Farshid T

Respostas:

197

Edit: parece que o nginx agora suporta error_log stderr;como mencionado na resposta de Anon .

Você pode enviar os logs para /dev/stdout. Em nginx.conf:

daemon off;
error_log /dev/stdout info;

http {
  access_log /dev/stdout;
  ...
}

edit: Pode ser necessário executar ln -sf / proc / self / fd / dev / se estiver executando certos contêineres de docker, use /dev/fd/1ou/dev/fd/2

Patrick
fonte
2
Quando tento fazer isso, recebo o seguinte erro: 2014/07/29 10:19:09 [emerg] 13742 # 0: open () "/ dev / stdout" falhou (13: permissão negada)
Jon Tirsen
1
Jon, em que sistema você está? No meu sistema, / dev / stdout é um link simbólico legível mundialmente para / dev / fd / 1, que pertence e é lido + gravável pelo meu usuário.
284 Patrick
1
Estou vendo isso falhar ENXIOquando stdout está aberto em um soquete e não em um arquivo. Há um tíquete de kernel upstream indicando que isso é intencional e por intenção: bugzilla.kernel.org/show_bug.cgi?id=1360 - portanto, embora essa resposta seja suficiente em alguns casos, ela não cobre totalmente o possível falhas.
Charles Duffy
1
Perdeu algumas horas com isso sem nenhum sucesso. Tentou mudar tudo (modos daemon, usuários, versões do nginx etc). Simplesmente não funciona para mim. "" "open ()" / dev / stderr "falhou (6: nenhum dispositivo ou endereço desse tipo)" "" (mesmos problemas com o stdout, mas o nginx deve stderr
gerar de
1
Dentro de uma janela de encaixe, você pode obter permissão negada se o processo não for executado como raiz no contêiner. Há uma correção para isso na próxima versão.
Dobes Vandermeer
54

Se a pergunta estiver relacionada ao docker ... as imagens oficiais do nginx docker fazem isso fazendo links para stdout / stderr

RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log

REF: https://microbadger.com/images/nginx

Boeboe
fonte
5
Essa resposta está correta, mas infelizmente não para as imagens alpinas (consulte github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), apenas para as outras pessoas como jessie , use esta declaração. Se você é um usuário alpino, crie seu próprio Dockerfile com FROM nginx:alpine RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log CMD ["nginx-debug", "-g", "daemon off;"]
jonashackt
1
A resposta de Patrick funciona para imagens oficiais do nginx ( hub.docker.com/_/nginx ), tanto para o debian (mais recente) quanto para as bases alpinas.
Farshid T
Seu link REF parece estar morto.
Peedee
@jonashackt eu usei imagens alpinas e eu achei também registrados para stdout
Qiulang
Clique em uma versão ( hub.docker.com/_/nginx ) para ver o arquivo da janela de encaixe com a linha mencionada anteriormente (em algum lugar antes da linha 100).
Qräbnö 20/12/19
24
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:    
error_log logs/error.log error;
Context:    main, http, stream, server, location

http://nginx.org/en/docs/ngx_core_module.html#error_log

Não use: /dev/stderr isso interromperá sua configuração se você usar o systemd-nspawn.

Anon
fonte
5

Ao executar o Nginx em um contêiner do Docker, lembre-se de que um volume montado sobre o diretório de log anula o propósito de criar um link suave entre os arquivos de log e o stdout / stderr no seu Dockerfile, conforme descrito na resposta do @Boeboe .

Nesse caso, você pode criar o softlink no seu ponto de entrada (executado após a montagem dos volumes) ou não usar um volume (por exemplo, quando os logs já são coletados por um sistema de registro central).

vigoroso
fonte
3

Na imagem do docker do PHP-FPM, eu vejo essa abordagem:

# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2

[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
Oleg Neumyvakin
fonte
1

Para uma finalidade de depuração:

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"

Para um propósito clássico

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"

Exigir

Sob o suporte do servidor no arquivo de configuração

access_log /dev/stdout;
intika
fonte