Loggin logs do Nginx

6

Estou executando o Ubuntu 15.04 e tenho uma instalação padrão de nginx ( apt-get install nginx ) em execução.

Tudo está funcionando bem, mas percebo que os nginx logs estão sendo rotacionados, mas nginx continua enviando para o mesmo arquivo de log, por exemplo, /var/log/nginx/error.log está vazio ainda /var/log/nginx/error.log.1 está recebendo material escrito para ele.

É claro que se eu reiniciar nginx o arquivo de log regular começa a ser gravado. Existe algum erro em algum lugar no script logrotate ? Precisa reiniciar nginx em uma rotação?

    
por willwade 28.05.2015 / 15:22

2 respostas

4

Você está executando o Ubuntu versão 15.

Sim, você poderia se virar com logrotate e com trechos de script como nas outras respostas. Mas você está executando a versão 15 do Ubuntu . Em seu sistema operacional, os serviços são executados em systemd, que por padrão captura suas saídas padrão de erro e syslog e manipula o registro em log. Não há necessidade de o nginx escrever para esse arquivo error.log em primeiro lugar. Não há necessidade de logrotate .

Outras respostas e os comentários abaixo deles podem fazer com que você veja /etc/init.d/nginx . Não faça Esse arquivo é irrelevante. Você está executando o Ubuntu versão 15 . O arquivo relevante, como fornecido diretamente no pacote nginx-common do Ubuntu, é /lib/systemd/system/nginx.service , que é o que o systemd estará usando, ignorando completamente o antigo arquivo /etc/init.d/nginx , que é totalmente substituído por um arquivo de unidade de serviço systemd apropriado .

Outras respostas podem levar você a ver também /etc/logrotate.d/nginx . Você pode ficar perplexo com a contradição entre o que você pode ver claramente , tentando executar o script antigo System 5 rc com um subcomando não-padrão invoke-rc.d e a afirmação de que não há uma sub-rotina postrotate . Mas, novamente, simplesmente não. Não se concentre nessas estrofes de controle logrotate em primeiro lugar. Você está executando o Ubuntu versão 15 com um pacote que já tem uma unidade de sistema e não está usando scripts System 5 rc em seu sistema operacional e um gerenciador de serviços que registra a saída do serviço.

Dois passos para fazer as coisas da maneira sistêmica:

Configure o nginx de forma mais adequada.

Seu serviço nginx precisa ser informado para simplesmente gravar seu log em seu erro padrão. Como bônus, você pode enviar seu registro de acesso ao periódico via syslog, que também intercepta o systemd.

Isso é feito com as diretivas de configuração global nginx e as diretrizes do módulo http. Especificamente:

  • error_log stderr ;
  • access_log syslog:server=unix:/dev/log ;

Você pode alterar seu arquivo nginx.conf para dizer essa pessoa , ou fazer o que Alexander Kuznecov fez aqui e alterou seu arquivo nginx.service unit para passar diretivas (globais) no nginx linha de comando:

Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/bin/nginx -g 'daemon on; error_log stderr; master_process on;'

Esqueça logrotate inteiramente.

systemd coloca a saída padrão e o erro padrão de todos os serviços em seu diário. Ele lida com a rotação dos próprios arquivos de diário. Não há sinais e nenhum recarregamento do serviço nginx envolvido. Você pode ler as últimas entradas no diário relacionadas ao serviço com (executar como superusuário ou como um usuário adm )

systemctl status nginx.service
Você pode ler tudo no log desse serviço desde a última inicialização com
journalctl -u nginx.service -b
    
por JdeBP 29.05.2015 / 22:48
1

O motivo nginx está gravando no arquivo girado é uma seção postrotate ausente no arquivo logrotate para nginx para recarregar a configuração de nginx .

logrotate renomeou o arquivo, mas renomear não fecha nem altera o descritor de arquivo (o kernel mantém internamente uma tabela de descritores que demonstra todos os arquivos abertos por identificadores ou descritores de arquivos), o identificador de arquivo permanece o mesmo anteriormente. Portanto, o processo nginx continuará sendo despejado no mesmo identificador de arquivo (o rotacionado) em vez do arquivo recém-criado.

Para resolver esse problema, adicione uma seção postrotate no arquivo de configuração logrotate para recarregar o arquivo de configuração de nginx .

Por exemplo, aqui está a seção postrotate de /etc/logrotate.d/apache2 :

    postrotate
            if /etc/init.d/apache2 status > /dev/null ; then \
                /etc/init.d/apache2 reload > /dev/null; \
            fi;
    endscript
    
por heemayl 28.05.2015 / 16:24