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
command-line
scripts
files
log
pylover
fonte
fonte
/var/log
é onde o sistema coloca as mensagens que você pode precisar mais tarde. O Ubuntu já encontrou o problema antes. Leiaman 8 logrotate;man logrotate.conf
.Respostas:
tente isto:
truncate -s 0 /var/log/*log
EDITAR:
se você quiser fazer isso mais de uma vez, use
logrotate
para manipular seus logs. Geralmente é instalado no ubuntu. Vejaman 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:
fonte
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:
Observando que, se você já estiver
logrotate
executando, precisará limpar também os.gz
logs girados :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
logrotate
para isso.fonte
Como acompanhamento de @DEN resposta
Isso localizará todos os arquivos de log
/var/log
e os truncará para 0 bytes.fonte
*.log*
vez disso, eu usaria, mas não tenho certeza se é 100% seguro, por isso não o incluí na resposta. Porque existem arquivos comodovecot.log-20180930
edovecot.log-20180923.gz
.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.txt
ou: > file.txt
(e, no caso debash
shell, o>
redirecionamento é suficiente). Isso se deve à maneira como>
abre arquivos viaopen()
ouopenat()
syscall comO_WRONLY|O_CREAT|O_TRUNC
sinalizadores - 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:
Nomeie o arquivo que armazena esse código
trunc.c
e compile-ogcc trunc.c -o trunc
e você terá um pequeno utilitário que truncará um argumento de nome de arquivo fornecido como emtrunc ./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 fazerQuanto à localização de todos os
.log
arquivos, isso já foi abordado em outras respostas - use*
glob ou glob estendidobash
. Há tambémfind -type f -name "*.log"
, que tem-exec
bandeira para a execução de comandos (neste caso em particularsh -c ''
para aproveitar>
porque>
é um operador de shell e não um executável externo). Assim você pode fazerTambém é importante notar que os arquivos de log no diretório, como
/var/log
muitas 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 vezEntre outras coisas, podemos copiar
/dev/null
para o arquivo desejado. Por incrível que pareça, embora/dev/null
seja 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 GNUcp
. Assim nós podemos fazerou
Outra leitura sugerida:
fonte
É 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.
fonte
for logfile in /path/*.log
vez disso.