Como truncar todos os arquivos de log?

17

alguém pode me dar uma solução para truncar todos os arquivos de log no /var/log/diretório?

e uma pergunta apenas para conhecimento, é uma boa ideia ou não?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done
pylover
fonte
11
NÃO é uma boa ideia - /var/logé onde o sistema coloca as mensagens que você pode precisar mais tarde. O Ubuntu já encontrou o problema antes. Leia man 8 logrotate;man logrotate.conf.
waltinator

Respostas:

34

tente isto:

truncate -s 0 /var/log/*log

EDITAR:

se você quiser fazer isso mais de uma vez, use logrotatepara manipular seus logs. Geralmente é instalado no ubuntu. Veja man logrotate(ou, se não o tiver instalado, consulte a página de manual online ou instale-a comsudo apt-get install logrotate )

da página de manual:

O logrotate foi desenvolvido para facilitar a administração de sistemas que geram um grande número de arquivos de log. Permite rotação automática, compactação, remoção e envio de arquivos de log. Cada arquivo de log pode ser tratado diariamente, semanalmente, mensalmente ou quando cresce muito.

DEN
fonte
também você pode esvaziá-los usando echo ""> * log
Astm
10

Se você deseja limpar todos os seus arquivos de log, não apenas aqueles na pasta de log de primeiro nível, você pode usar:

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

Observando que, se você já estiver logrotateexecutando, precisará limpar também os .gzlogs girados :

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

Um uso válido para isso pode estar criando um contêiner de dispositivo VM para distribuição, por exemplo.

Você não precisa fazer isso como parte da manutenção de rotina: como o DEM sugeriu corretamente, use logrotatepara isso.

msanford
fonte
1

Como acompanhamento de @DEN resposta

Isso localizará todos os arquivos de log /var/loge os truncará para 0 bytes.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
Luka
fonte
11
Em *.log*vez disso, eu usaria, mas não tenho certeza se é 100% seguro, por isso não o incluí na resposta. Porque existem arquivos como dovecot.log-20180930e dovecot.log-20180923.gz.
Luka
0

Existem alguns métodos para truncar completamente um arquivo, geralmente aplicável à maioria dos sistemas operacionais compatíveis com POSIX. O mais comum que você verá com scripts de shell é algo como true > file.txtou : > file.txt(e, no caso de bashshell, o >redirecionamento é suficiente). Isso se deve à maneira como >abre arquivos via open()ou openat()syscall com O_WRONLY|O_CREAT|O_TRUNCsinalizadores - que lê somente gravação OU cria se o nome do arquivo não existir, OU truncará o nome do arquivo existente.

Com isso em mente, podemos implementar algo parecido em C:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

Nomeie o arquivo que armazena esse código trunc.ce compile-o gcc trunc.c -o trunce você terá um pequeno utilitário que truncará um argumento de nome de arquivo fornecido como em trunc ./foobar.txt. Obviamente, esse código não faz outras verificações, apenas trunca o primeiro parâmetro posicional. Vou deixar para os leitores descobrir como lidar com mais de um parâmetro posicional. Na nota lateral, há truncate()syscall que também poderíamos usar e truncar um arquivo com tamanho variável.

Agora, se você não é fã de C, o Python pode ser mais fácil para você. open()O comando opera com o mesmo princípio no Python - abrindo arquivo para escrever e truncar se o nome do arquivo existir. Assim nós podemos fazer

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

Quanto à localização de todos os .logarquivos, isso já foi abordado em outras respostas - use *glob ou glob estendido bash. Há também find -type f -name "*.log", que tem -execbandeira para a execução de comandos (neste caso em particular sh -c ''para aproveitar >porque >é um operador de shell e não um executável externo). Assim você pode fazer

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

Também é importante notar que os arquivos de log no diretório, como /var/logmuitas vezes são rodados pelo serviço logrotate, então haverá nomes de arquivos tais como /var/log/service.log, /var/log/service.log.1, etc, para que você pode querer usar *.log.[1-9]padrão em vez


Entre outras coisas, podemos copiar /dev/nullpara o arquivo desejado. Por incrível que pareça, embora /dev/nullseja um tipo de arquivo de dispositivo de caractere especial, quando você copia isso em outro lugar, o resultado é um arquivo normal vazio, pelo menos com o GNU cp. Assim nós podemos fazer

cp /dev/null foo.txt

ou

dd if=/dev/null of=foo.txt

Outra leitura sugerida:

Sergiy Kolodyazhnyy
fonte
0

É uma boa prática girar os logs em / var / logs para girar com a funcionalidade de rotação de logs, mas não sempre que desejamos. Os logs do sistema serão impressos nela e serão úteis para depurar qualquer falha.

Se for um requisito não usar o logrotate, as opções poderão ser exploradas. Embora truncar seja uma opção fácil em alguns tipos de sistema unix, esse comando não está disponível prontamente, precisa ser instalado. Se não for permitido instalar o novo comando, o loop abaixo pode ser usado.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done
Devoloper250
fonte
Bash Pitfall # 1 : Não escreva para loops dessa maneira. Use em for logfile in /path/*.logvez disso.
PerlDuck 10/05/19