A rotação de logs do Tomcat no Solaris com o logdam cria um bloco crescente de nulos

1

Eu preciso rotacionar alguns logs do Tomcat no Solaris. Quando tento usar o logadm com a opção -c, a rotação parece ocorrer corretamente, mas, em seguida, catalina.out se torna um bloco de nulos do mesmo tamanho que a peça girada e novos dados são gravados após esses nulos. É como se o ponteiro de posição do arquivo nunca fosse movido e a saída do Tomcat continuasse avançando da mesma posição.

Como resultado, catalina.out continua a crescer. O bloco principal de nulos cresce a cada evento de rotação.

Quando funciona, essa é a solução de rotação de log mais conveniente que eu conheço, porque você não precisa modificar o catalina.sh. Mas não está funcionando, e a alternativa - canalizar a saída através do logrotate do Apache - requer a modificação do catalina.sh, o que eu prefiro não fazer. Isso significa outra mudança local para rastrear toda vez que atualizamos o Tomcat.

    
por Joshua Swink 03.09.2009 / 02:02

2 respostas

2

Na verdade, catalina.sh pretende abrir catalina.out com O_APPEND : >> "$CATALINA_OUT" 2>&1 &

A causa raiz é o shell: #!/bin/sh . O shell padrão do Solaris ( /bin/sh ) não interpreta >> corretamente para abrir o arquivo de saída com O_APPEND .

Isso não é um problema no Linux. Você pode contornar isso para o Solaris com um shell compatível com os padrões: /usr/xpg4/bin/sh (consulte man sh )

Modifique catalina.sh e substitua #!/bin/sh por #!/usr/xpg4/bin/sh . A desvantagem é que toda vez que você atualiza o Tomcat, você precisa refazê-lo.

É fácil verificar se catalina.out está aberto com O_APPEND ou não usando o comando pfiles .

1: S_IFREG mode:0644 dev:32,5 ino:13738 uid:0 gid:0 size:10170
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
   /opt/tomcat6/logs/catalina.out

Você pode ver que /usr/xpg4/bin/sh abre catalina.out com O_APPEND .

    
por 21.12.2011 / 23:34
1

É exatamente isso; O Tomcat (catalina.sh, para ser específico) não abre seu arquivo de log com O_APPEND, e assim as gravações ocorrem na posição anterior, criando um furo (nulos, ocupando nenhum espaço em disco) até esse ponto.

Uma opção é ter um post_command para reiniciar o Tomcat após a rotação.

Outra é fazer catalina.out um pipe nomeado e ter um programa lendo e fazendo "a coisa certa". A falha é que se o programa não estiver rodando, o Tomcat irá encher o buffer do pipe e então bloquear até que seja drenado.

    
por 18.09.2009 / 00:41