Jump to content

Como limpar arquivos de ERROR_LOG de forma eficiente


Recommended Posts

Estou adaptando um pequeno script para:

1. Procurar por todos os arquivos de ERROR_LOG na pasta "/home" de todos os usuários.

2. Deixar APENAS as últimas 100 linhas neste arquivo, ou seja, um arquivo de 2GB de logs será incrivelmente reduzido pois só ficarão as últimas 100 linhas.

find /home -type f -iname error_log -exec tail -n 100 {} > {} \;

No entanto ele não está funcionando pelo que li a respeito por dois motivos:

1. O Linux resolve redirecionamentos antes de executar comandos, ou seja, quando ele tenta resolver o segundo "{}" é retornado um arquivo vazio.

2. Não é possível usar -exec com múltiplos {} no find facilmente.

Como eu poderia consertar este script?

Edited by the_superman
Link to comment
Share on other sites

Olá,

O arquivo error_log só existe pra um motivo, informar o usuario de que algo na programação do seu script contem algum erro.
Se o arquivo error_log está ficando com tamanho grande, o usuario deve abrir o arquivo e verificar a causa  dos erros, para então fazer a correção. 
Senão fizer essa correção o arquivo vai ficar crescendo infinitamente, senão souber como corrigir ou não quiser, não tiver tempo, enfim por qualquer outro motivo, pode ser feita uma gambiarra.
Sendo o script em php coloque esse esqueminha na conta que contem o arquivo error_log com tamanho grande
array_map('unlink', glob("error_log")); 


Isso vai remover o arquivo error_log toda vez que esse arquivo .php for acessado.
Eu geralmente por preguiça mesmo coloco isso em paineis que usam o arquivo que verifica a sessão, mas senão for painel você pode colocar em um arquivo .php que for mais acesso, por exemplo o index.php.
Ou criar um cron com arquivo .php e rodar  em um determinado período.

Outra alternativa seria fazer um shell script pra remover o arquivo error_log de todas as contas.
Ou verificar o arquivo error_log que contem conteúdo pra você saber que essa conta tem algum erro na programação do script.
Seria 2 palitos pra fazer isso, porem teria que rodar algumas vezes ao dia e não sei se seria legal dependendo da config do servidor.

Sobre o find seria quase o mesmo que fazer um script e poderia consumir um pouco

find /home -iname "error_log" -exec rm -fr {} \;

Esse comando vai percorrer toda a /home do servidor e remover qualquer arquivo error_log que encontrar.
Com shell script ficaria algo muito melhor de se fazer, pois poderia ser percorrida somente a home dos usuarios, não sendo percorrido outros diretorios que tiver na /home do servidor em si.

 

 

 

 

 

Link to comment
Share on other sites

Interessante que a despeito do título do tópico @pluginscpanelwhm, esse seu exemplo demonstra bem a diferença entre fazer algo de forma eficaz e eficiente.

Remover os arquivos de ERROR_LOG, considerando que os mesmos serão criados novamente depois é eficaz mas não é eficiente pois terá casos em que o usuário poderá ter o azar de está procurando os arquivos de erros e eles serem excluídos logo em seguida. Embora imagine que provavelmente essa situação nunca tenha ocorrido com você.

Por outro lado, deixando as últimas 100 linhas isso pode ajudar no DEBUG de uma aplicação que esteja apresentando problemas de formas constantes, pois nem sempre o erro é o mesmo. Tome o exemplo de uma exceção gerada por uma regra do ModSecurity por exemplo que só é acionada em caso de eventos específicos que considerando o fato que ocorram a cada X tempo, cria-se um intervalo de tempo onde esse erro poderá ficar invisível para o usuário.

Essa questão do PHP não vou mexer. Acho interessante fazer só com o bom e velho find mesmo. Considerando os objetivos que citei na minha postagem, tem sugestão de como poderia corrigir este comando para alcançar o objetivo desejado?

Ah propósito, para melhorar a legibilidade seu comando poderia ser escrito assim também:

find /home -iname "error_log" -delete

Embora isso seja só questão de gosto mesmo. O resultado é o mesmo.

Link to comment
Share on other sites

Olá,
Existem  diversas formas de programar e de se chegar ao objetivo.
Eu vejo que você quer fazer em uma linha o que precisa de mais de uma linha.
Segue o script que acredito que faz o que você precisa, o script salva o conteudo do arquivo error_log para um .txt temporário
e depois pega esse .txt temporário e salva no arquivo error_log original somente as 100 ultimas linhas.
Desse modo os usuarios vão ter o arquivo error_log somente com as 100 ultimas linhas.

pega-logs.sh
Envie o arquivo pega-logs.sh  para  /bin e dê permissão nele

#!/bin/bash
SHELL=/bin/sh
PATH=/sbin:/usr/sbin:/usr/bin:/bin

# salva em um arquivo .txt todos usuarios do servidor

cat /etc/trueuserowners | cut -d: -f1 | sort | uniq | awk -F " " '{print "US " $1 }' >/tmp/lista-usuarios.txt

# loop com while lendo a lista de usuarios
cat /tmp/lista-usuarios.txt |sed -r 's/(US)//g'|
while read US
do

VERIFICA=$( cat /home/$US/public_html/error_log | wc -l)

if [ "$VERIFICA" -gt "0" ];
then
echo -e ""
# salva o conteudo do arquivo error_log em um error_log.txt
cat /home/$US/public_html/error_log >/home/$US/public_html/error_log.txt 
# inverte salvando as ultimas 100 linhas do arquivo error_log.txt para o arquivo error_log original
cat /home/$US/public_html/error_log.txt | sed -e :a -e '$q;N;100,$D;ba' >/home/$US/public_html/error_log 
# remove o arquivo error_log.txt ( fica a seu criterio remove-lo ou criar uma pasta no servidor para salvar os logs) 
rm -rf /home/$US/public_html/error_log.txt 
else
echo -e ""
fi
done


OBS: Força do hábito, fiz o script para cPanel, se você utiliza outro painel, terá que modificar a primeira parte do script  onde pega os usuarios do servidor.
 

Edited by pluginscpanelwhm
esqueci de informar que o script foi feito para cPanel
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...