Existe uma maneira correta de limpar logs?

56

Eu queria saber se havia uma maneira correta de limpar logs em geral?

Sou novo no Ubuntu e estou tentando configurar o Postfix. O log em questão é /var/log/mail.log . Eu estava me perguntando se havia uma maneira correta de apagá-lo, em vez de eu entrar nele e excluir todas as linhas e salvá-lo. Eu acho que, às vezes, os erros não são gravados nele imediatamente depois de limpar o log e salvá-lo.

Nota: Estou tendo problemas para configurar o Postfix e estou tentando facilitar a leitura dos logs, esperando que isso possa me ajudar, em vez de ter que percorrer todo o caminho.

    
por mastofact 30.06.2011 / 18:13

9 respostas

71

Você pode usar:

> /var/log/mail.log

Isso truncará o log sem que você tenha que editar o arquivo. É também uma maneira confiável de recuperar o espaço. Às vezes as pessoas cometem o erro de usar rm no log e recriar o nome do arquivo, se outro processo tiver o arquivo aberto, você não recuperará o espaço até que o processo feche o identificador e você possa atrapalhar suas permissões.

Além disso, se você estiver assistindo ao conteúdo do log, talvez queira usar o comando tail :

tail -f /var/log/mail.log

Ctrl-C interromperá o processo.

    
por 30.06.2011 / 18:20
22

Sim, há uma maneira correta: você não limpa os registros. Você gira eles. A rotação envolve alternar a saída do log para um novo arquivo, sob o mesmo nome, com os N arquivos de log anteriores mantidos sob um conjunto de N nomes de arquivos relacionados.

Como um rotaciona logs depende de como alguém os está escrevendo em primeiro lugar. Este é um ponto frequentemente ignorado. Algumas das respostas aqui mencionam pelo menos, mencionando que alguns programas de log mantêm um descritor de arquivo aberto para o arquivo de log, portanto, apenas excluir o arquivo não libera espaço ou, na verdade, até mesmo alterna a saída para um novo arquivo de log.

Se o programa que está gravando o arquivo de registro for multilog do daemontools package , por exemplo, você não faz nada para girar os logs - não há scripts manuais, não há cron jobs. Simplesmente diga multilog que a saída do log é para um diretório, e ele manterá um conjunto de N arquivos de log automaticamente rotacionados e com tamanho limitado nesse diretório.

Se o programa que está gravando os arquivos de log estiver svlogd do runit package , por outro exemplo, então o mesmo se aplica. Você não faz nada, além de apontar a ferramenta em um diretório. Ele manterá um conjunto de arquivos de log N girados automaticamente e com tamanho limitado nesse diretório.

Se você estiver usando rsyslog para gravar arquivos de log, então o programa de registro pode ser disse para parar após o arquivo de log atingir um determinado tamanho e executar um script . Você tem que escrever a parte do script, para realmente renomear o arquivo de log e excluir arquivos de log antigos com base nas restrições de tamanho total, mas pelo menos o programa de log fechou o arquivo e pausou a gravação enquanto isso está acontecendo.

A antiga maneira de%% de% de registros rotativos, ainda é esperada registrando programas como o syslog-ng e como exemplificado por ferramentas como syslogd mencionado por logrotate em outra resposta aqui, é um pouco mais aleatório. Um executa um trabalho djangofan que periodicamente renomeia os arquivos de log e reinicia o daemon de registro (usando qualquer supervisor de daemon em execução). O problema com isso, é claro, é que ele não impõe um limite de tamanho total. Em semanas lentas, pode-se obter N arquivos de log diários muito pequenos, enquanto nos dias de maior movimento, é possível obter um arquivo de log muito grande, bem acima do limite de tamanho.

É por isso que ferramentas posteriores e melhores, como cron e multilog , possuem opções de configuração de tamanho de arquivo e, na verdade, verificam os tamanhos dos arquivos de log, é claro. O mundo aprendeu que pesquisar os logs em uma programação com svlogd jobs, ou até mesmo um daemon cron , deixa as janelas para o tamanho estar errado, e que o local apropriado para ter essas verificações, e então rigourously imponha limites de tamanho definidos pelo administrador para que os arquivos de log de uma pessoa nunca engulam a partição em que estão, está no programa que está realmente gravando os arquivos em primeiro lugar.

    
por 01.07.2011 / 12:58
10

Sim, existe uma ferramenta para o linux chamada LogRotate .

    
por 30.06.2011 / 18:36
8

Se o motivo pelo qual você desmarca o log é liberar espaço, você pode cat / dev / null para eles, sem interromper os programas gravados nele. Nunca os apague! alguns softwares podem reclamar parando de funcionar ou ignorando o log completamente até a próxima reinicialização

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done
    
por 20.04.2012 / 02:55
4

Você também pode usar isso ...

truncate /opt/package/logs/*.log --size 0

Aqui, todos os arquivos de log no / opt / package / logs ficarão vazios.

    
por 25.06.2015 / 07:32
3

Substituição de conteúdo curto e compatível: : > /dest/file

Mas também há a chamada de sistema truncate (2) e a ferramenta de espaço do usuário correspondente truncate em muitos * NIX'es.

    
por 20.04.2012 / 03:25
0

Se você quiser manter o arquivo antes de limpá-lo, faça o seguinte:

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

Se você quiser pesquisar um texto ou email específico no log, você pode usar o grep. Se você quiser manter alguns gráficos sobre o uso de email, use o AWStats.

    
por 30.06.2011 / 18:25
0

cat /dev/null > /path/to/logfile

Funciona para mim

    
por 22.11.2016 / 03:21
0

Veja como eu faço isso, e isso é só para o NGINX, você pode removê-lo para que ele funcione em todos os arquivos de log.

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "---------------                                     
por 25.03.2017 / 01:28