Назад | Перейти на главную страницу

Ротация журналов Tomcat на Solaris с logdam создает растущий блок нулей

Мне нужно повернуть некоторые журналы Tomcat в Solaris. Когда я пытаюсь использовать logadm с опцией -c, вращение кажется правильным, но тогда catalina.out становится блоком нулей того же размера, что и вращаемая часть, и новые данные записываются после этих нулей. Это как если бы указатель позиции файла никогда не перемещался, а вывод Tomcat продолжает продвигаться с той же позиции.

В результате catalina.out продолжает расти. Ведущий блок нулей растет с каждым событием вращения.

Когда это работает, это наиболее удобное решение для ротации журналов, которое я знаю, потому что вам не нужно изменять catalina.sh. Но это не работает, и альтернатива - передача вывода через Apache logrotate - требует изменения catalina.sh, чего я бы не стал делать. Это означает еще одно локальное изменение, которое нужно отслеживать каждый раз, когда мы обновляем Tomcat.

Фактически, catalina.sh намеревается открыть catalina.out с участием O_APPEND: >> "$CATALINA_OUT" 2>&1 &

Основная причина - оболочка: #!/bin/sh. Оболочка по умолчанию Solaris (/bin/sh) не интерпретирует >> правильно открыть выходной файл с помощью O_APPEND.

В Linux это не проблема. Вы можете обойти это для Solaris с помощью совместимой со стандартами оболочки: /usr/xpg4/bin/sh (видеть man sh)

Изменить catalina.sh и заменить #!/bin/sh с участием #!/usr/xpg4/bin/sh. Недостатком является то, что каждый раз, когда вы обновляете Tomcat, вам нужно переделывать его.

Легко проверить, действительно ли catalina.out открывается с O_APPEND или не используя 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

Ты это видишь /usr/xpg4/bin/sh открывается catalina.out с участием O_APPEND.

Это именно то; Tomcat (в частности, catalina.sh) не открывает свой файл журнала с помощью O_APPEND, и поэтому записи происходят в предыдущей позиции, создавая дыру (нули, не занимая дискового пространства) до этого момента.

Один из вариантов - использовать post_command для перезапуска Tomcat после ротации.

Другой - сделать catalina.out именованным каналом и заставить программу читать из него и делать «правильные вещи». Недостаток в том, что если программа не запущена, Tomcat заполнит буфер канала и затем заблокируется, пока он не будет опустошен.