Existe uma maneira de excluir / truncar um arquivo enquanto um processo está gravando nele?

6

Temos um servidor apache rodando no linux gravando em um arquivo de log que está ficando muito grande (access_log). Nosso servidor começará a ficar sem espaço. Existe uma maneira de excluir ou truncar o arquivo sem reiniciar o servidor (não queremos tempo de inatividade).

    
por erotsppa 05.10.2009 / 21:23

7 respostas

13

Como redefinir seus arquivos de log

Mais cedo ou mais tarde, você desejará redefinir seus arquivos de registro ( access_log e error_log ) porque eles são muito grandes ou contêm informações antigas desnecessárias.

access_log normalmente cresce em 1Mb para cada 10.000 solicitações.

A primeira tentativa da maioria das pessoas em substituir o arquivo de log é apenas mover o arquivo de log ou remover o arquivo de log. Isso não funciona.

O Apache continuará gravando no arquivo de log no mesmo deslocamento de antes do arquivo de log movido. Isso resulta em um novo arquivo de log sendo criado, que é tão grande quanto o antigo, mas agora contém milhares (ou milhões) de caracteres nulos.

O procedimento correto é mover o arquivo de log e sinalizar o Apache para que ele reabra os arquivos de log.

O Apache é sinalizado usando o sinal SIGHUP (-1). por exemplo,

mv access_log access_log.old
kill -1 'cat httpd.pid' 

Nota: httpd.pid é um arquivo contendo o id do processo do daemon httpd Apache, o Apache salva este no mesmo diretório que os arquivos de log.

Muitas pessoas usam esse método para substituir (e fazer backup) seus arquivos de registro em uma base semanal ou semanal.

link

    
por 05.10.2009 / 21:28
6

a rotação de log é a solução a longo prazo, mas a resposta para sua pergunta imediata é truncar o arquivo assim:

sudo cat /dev/null > /var/log/httpd/access_log

Estou assumindo que você não está logado como root e assumindo a localização do seu arquivo de log, mas você deve ser capaz de ajustar o comando conforme necessário e rapidamente truncar um arquivo de log aberto sem tocar nos processos do apache em execução.

    
por 05.10.2009 / 23:06
5

Zere o arquivo de log ...

# :>filename
    
por 19.11.2009 / 04:04
5

Se você quiser truncar / zero um arquivo de log para o qual você não tem acesso de gravação, você pode fazer

sudo truncate -s0 logfile
    
por 26.06.2013 / 10:06
3

Tente usar logrotate

  • é uma ferramenta poderosa que fornece opções configuráveis para registros rotativos.
  • também tem facilidade para executar o comando durante prerotate e postrotate
  • copytruncate permite que você copie os arquivos existentes e trunque-os. A cópia pode ser movida para outro armazenamento, como hadoop, s3 para backup, se desejado
  • Além disso, um cron pode ser definido como /usr/sbin/logrotate --force /etc/logrotate.hourly.conf 2>&1 >> /tmp/logger usando /etc/cron.hourly/logrotate

Para mais informações man logrotate

    
por 15.12.2016 / 00:33
2

Simplesmente você pode criar primeiro $ cat filename >bkp_filename do que criará uma cópia do "nome do arquivo" do que anula o arquivo original como $ >filename reduzirá para tamanho zero, agora faça zip para bkp_filename como $ gzip bkp_filename , por isso fornecerá mais tamanho e seu ponto de montagem é verde agora

    
por 08.09.2015 / 16:57
0

Tive o mesmo problema com um processo e o consertei usando o pipe nomeado do Linux. Aqui está o que eu fiz (assumindo que /tmp/job.log é o arquivo de log):

  1. Pare o trabalho
  2. rm /tmp/job.log
  3. criou um canal nomeado usando mkfifo: mkfifo /tmp/job.log
  4. executado: cat /tmp/job.log | gzip > /tmp/job.log.gz
  5. Iniciar o trabalho

Dessa forma, consegui manter o log e reduzir drasticamente o uso do disco

você pode substituir o gzip por qualquer comando que filtre, gire, ...

    
por 14.02.2018 / 19:20