A algum tempo venho tendo problemas com o rotate de logs do Tomcat. Logicamente, os mais desavisados vão me falar a seguinte coisa: "caramba, você não tentou usar o logrotate nativo do próprio Linux
? ", mas logicamente eu já tentei esta solução.
O problema é : eu teria que parar o Tomcat. Minha idéia principal era rotacionar o log do Tomcat sem que eu precisasse de parar o servidor por alguns momentos, tendo em vista que algumas aplicações hospedadas no mesmo são 24x7.
Como não sou grande especialista no tal do Tomcat corri atrás de algumas coisas que pudessem me ajudar a resolver o problema. Cai, como sempre em um dos melhores blogs para este tipo de coisa que é o do Dan Moore, onde ele neste post cita alguns caminhos para rotacionar nossos amados logs do Tomcat sem ter que parar o bichinho.
Pronto, teoricamente eu já estava com meu problema resolvido. Mas, o cara manda para uma discussão dentro da lista do Tomcat, onde a galera postava, postava e no fim, alguém com uma luz tremenda resolveu meu problema.
Primeiro, vamos aos pontos. No Linux e Unixes em geral, o Tomcat possui um script de inicialização e parada do serviço, chamado catalina.sh, onde setamos boa parte das variáveis e coisas que irão estar funcionando com o nosso amiguinho. Sendo assim, todo o processo que iremos configurar aqui, será feito neste arquivo.
O programinha com o qual iremos trabalhar se chama cronolog ( citado, inclusive, na thread que o cara do blog fala ) . Bom, quem é o cronolog ? Ele é um simples programa que lê uma resultado de uma saída padrão e escreve em um arquivo qualquer que seja especificado em linha de comando. Quando o nome do arquivo muda ( exemplo, passa-se de um dia para outro ), ele passa a gravar em outro arquivo.
Sendo assim você tem um rotacionador automático sem reinício do processo de log do nosso amigo Tomcat.
Tendo em vista isto, vamos lá.
Baixe o cronolog no site oficial, e faça o famoso padrão :
# tar -xvzf cronolog-x.x.x.tar.gz
# cd cronolog-x.x.x
# ./configure
# make
Após isto, logicamente, você já tem o nosso binário criado. Eu, pessoalmente, achei mais legal colocar ele dentro do /usr/bin , assim :
# cd src
# cp cronolog /usr/bin
Resumo, temos já o cronolog no nosso PATH, prontinho para ser usado.
Agora, é passar para a edição do arquivo catalina.sh.
No catalina.sh, temos três linhas aonde vamos mexer, em negrito no exemplo abaixo :
touch "$CATALINA_BASE"/logs/catalina.out
if [ "$1" = "-security" ] ; then
echo "Using Security Manager"
shift
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
if [ ! -z "$CATALINA_PID" ]; then
echo $! > $CATALINA_PID
fi
else
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
Bonitinho o código acima não ? Como pode ser visto, todo o resultado do login, funcionamento do Tomcat é redirecionado para um arquivo que se chama catalina.out.
No Unix, os redirecionamentos podem ser feitos para arquivos ou para comandos, lembram-se disto ? Bom, pois é desta peculiaridade do nosso querido shell que vamos utilizar para que o cronolog faça o nosso amado trabalho.
Veja abaixo, agora, como irá ficar nosso catalina.sh após a edição.
# touch "$CATALINA_BASE"/logs/catalina.out
if [ "$1" = "-security" ] ; then
echo "Using Security Manager"
shift
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start \
| /bin/cronolog "$CATALINA_BASE"/logs/%Y-%M-%D.catalina.out >> /dev/null 2>&1 &
if [ ! -z "$CATALINA_PID" ]; then
echo $! > $CATALINA_PID
fi
else
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start \
| /bin/cronolog "$CATALINA_BASE"/logs/%Y-%M-%D.catalina.out >> /dev/null 2>&1 &
Explicando. Ao invés de mandar a saída para um arquivo, passamos a redirecionar a saída para um comando que é o cronolog. Assim, ele vai criar o log com o nome que quisermos dentro do diretório de logs do nosso tomcat ( eba ) !!!
A sintaxe no meu caso, é, para que, diariamente, haja o rotate. Através de uma lida no site/help do programa você consegue descobrir mais e mais aplicações para o bichinho.
No meu caso, pelo menos até agora, resolveu legal :-)
Atualização dia 02/11/2008 : descobri uma nova solução para este problema. Está neste post aqui.