FreeBSD

Rotação de Arquivos de Log


Para que não tenhamos arquivos de log muito grandes, geralmente se implementa alguma forma de rotacionar estes arquivos. Isto é feito normalmente através do newsyslog ou através de scripts. Iremos geralmente optar pelos scripts, devido à flexibilidade que proporciona. Segue abaixo um exemplo de script. Crie o arquivo /usr/local/script/rotate_log_programa.sh, com a permissão 700 e o seguinte conteúdo:

-------------------- Arquivo rotate_log_programa.sh --------------------
#!/bin/sh

# finaliza o Programa
/comando/para/finalizar/o/programa

# Define o nome para arquivamento
OLD_LOG=/caminho/para/o/arquivamento/programa.log.`date +%y%m%d-%H%M%S`

# move o arquivo para o diretorio de arquivamento
mv /arquivo/de/log/programa.log `echo $OLD_LOG`

# inicializa o Programa
/comando/para/inicializar/o/programa

# compacta o arquivado
/usr/bin/gzip $OLD_LOG

# apaga os logs com mais de um ano
find /caminho/para/o/arquivamento -mtime +365 -exec rm -f {} \;

-------------------- Fim do arquivo rotate_log_programa.sh --------------------

Edite o arquivo /etc/crontab e adicione uma linha para executar o script na hora desejada, como por exemplo:

0 0 1 * * root /usr/local/script/rotate_log_programa.sh

Isto fará com que o script de rotação do log seja acionado à meia-noite do primeiro dia do mês, separando os logs de cada mês em arquivos diferentes. Cada arquivo guardado terá data e hora anexado ao nome. O comando find é opcional e pode ser configurado com outro período de tempo.

Pode-se também utilizar um script mais elaborado, como o que segue abaixo. O que irá determinar isso é a preferência do administrador, que tem a liberdade de criar e personalizar os scripts como desejar.

-------------------- Arquivo rotate_exemplo.sh --------------------
#!/bin/sh
# Script para fazer o rotate de logs.

# Comando para finalizar o servico.
# Deve ser especificado entre '...'
# Caso nao for necessario, deixar em branco.
COMFIN=''

# Comando para inicializar o servico.
# Deve ser especificado entre '...'
# Caso nao for necessario, deixar em branco.
COMINI=''

# Diretorio para o arquivamento dos logs antigos.
DIRARQ=/diretorio/para/arquivamento

# Diretorio onde fica o arquivo de log atual.
DIRLOG=/diretorio/do/log/atual

# Nome do arquivo de log.
NOMELOG=nome_do_arquivo_de_log.log

# Dono do arquivo de log.
USULOG=root

# Grupo do arquivo de log.
GRPLOG=wheel

# Modo de permissao do arquivo de log.
PERLOG=600

# Compactar o arquivado (S/N).
COMPACTAR=S

# Apagar arquivos antigos (S/N).
APAGA_ANTIGOS=N

# Tempo em dias que os antigos deverao ser mantidos.
# Qualquer arquivo no diretorio dos antigos com idade
# superior ao especificado sera apagado.
TEMPO_ANTIGOS=180

#####################################################

$COMFIN > /dev/null
LOGARQ=$DIRARQ/$NOMELOG.`date +%y%m%d-%H%M%S`
LOGATU=$DIRLOG/$NOMELOG
mv $LOGATU $LOGARQ
touch $LOGATU
chown $USULOG $LOGATU
chgrp $GRPLOG $LOGATU
chmod $PERLOG $LOGATU
$COMINI > /dev/null
if [ $COMPACTAR = S ] ; then
/usr/bin/gzip $LOGARQ
fi
if [ $APAGA_ANTIGOS = S ] ; then
find $DIRARQ -mtime +$TEMPO_ANTIGOS -exec rm -f {} \;
fi

-------------------- Fim do arquivo rotate_exemplo.sh --------------------

 

Atualizado em 06/02/04.

Heini Thomas Geib.
http://www2.unijui.edu.br/~heini

Voltar