Alguém pode me dizer se isso é uma preocupação plausível com o apache?

2

Foi-me dito que a nossa reinicialização diária do Apache (roteirizada) foi configurada devido à nossa rotação de log. A preocupação é que o logrotate pode perder uma linha nos logs de acesso se ele rodar enquanto o apache está sendo executado e aceitando pedidos.

Alguém pode me dizer se isso é um absurdo plausível, verdadeiro ou completo?

    
por user21640 07.08.2009 / 21:17

4 respostas

9

Você precisa reiniciar o servidor depois que os logs forem rotacionados, pois o Apache mantém aberto o identificador de arquivo para o log e continuará gravando no arquivo de log antigo, se você não o fizer. O envio de USR1 para o pai (reinicialização normal) deve fazer o truque.

Referência: 1.3 , 2.2

Cite a partir de 2.2 docs:

On even a moderately busy server, the quantity of information stored in the log files is very large. The access log file typically grows 1 MB or more per 10,000 requests. It will consequently be necessary to periodically rotate the log files by moving or deleting the existing logs. This cannot be done while the server is running, because Apache will continue writing to the old log file as long as it holds the file open. Instead, the server must be restarted after the log files are moved or deleted so that it will open new log files.

By using a graceful restart, the server can be instructed to open new log files without losing any existing or pending connections from clients. However, in order to accomplish this, the server must continue to write to the old log files while it finishes serving old requests. It is therefore necessary to wait for some time after the restart before doing any processing on the log files. A typical scenario that simply rotates the logs and compresses the old logs to save space is:

mv access_log access_log.old
mv error_log error_log.old
apachectl graceful sleep 600
gzip access_log.old error_log.old 

Another way to perform log rotation is using piped logs as discussed in the next section.

    
por 07.08.2009 / 21:30
3

Totalmente plausível. Depende de como você está parando o Apache.

Se você está fazendo um HUP todas as noites para fazer com que os servidores iniciem o novo registro, então você não deve ter problemas. Qualquer parada desajeitada e reinicialização e você mesmo sua própria!

No entanto, quaisquer conexões presentes durante o HUP noturno serão perdidas e os participantes terão que se reconectar. Que pena se estiverem no meio de um grande download!

Se você estiver registrando os bytes servidos como parte da solicitação, a conexão não será registrada até que o download seja concluído, portanto, as conexões que foram eliminadas por causa do HUP estarão ausentes dos logs.

Você viu o novo lançamento 2.2.12?

Uma das mudanças é tornar o "piped through rotatelogs" mais robusto, para que você possa adiar a rotação para a concessionária rotatelogs e deixá-la no topo e na ponta dos logs, sem a necessidade de executar o HUP noturno. Portanto, nenhuma conexão descartada e nenhuma transação de log ausente se seus bytes de registro forem atendidos.

O documento diz

The rotation occurs at the beginning of this interval. For example, if the rotation time is 3600, the log file will be rotated at the beginning of every hour; if the rotation time is 86400, the log file will be rotated every night at midnight.

Se você olhar dentro de rotatelogs, não é óbvio como eles estão fazendo isso, já que não há números mágicos até você identificar a linha:

tLogStart = (now / tRotation) * tRotation;

E isso alinhará a hora de início com o início da hora atual (para tRotation == 3600) ou a meia-noite anterior (para tRotation == 86400). Quem sabe o que isso fará por qualquer outro número, por exemplo 16432?

Edit: Esqueci de dizer que vimos problemas com o gracioso não se comportando muito graciosamente. Especificamente, apenas deixando processos filhos suspensos. Isso parece ter sido reconhecido como v2.2.12 agora tem uma nova diretiva de configuração, GracefulShutdownTimeout, que especifica um tempo limite após o qual o processo httpd termina, independentemente de quaisquer solicitações sendo atendidas.

HTH

'Avahappy,

    
por 07.08.2009 / 21:36
2

Por que perder uma linha é tão importante? Se for tão importante, talvez os registros precisem ser impressos na barra verde como backup.

    
por 07.08.2009 / 21:29
1

Sim, de acordo com as outras respostas, o problema é que o apache continuará a gravar no identificador de arquivos aberto.

Nós (e muitas outras pessoas) usamos o cronlog para evitar isso. Nesta configuração, o apache canaliza os logs para o cronolog e o servidor não precisa ser reiniciado / recarregado.

    
por 08.08.2009 / 04:22