Существует много вещей, которыми это могло бы быть. Мой опыт, это часто происходит из-за проблем памяти. Когда используемый размер "кучи" становится большим, сборщик "мусора" входит в перегрузку, и производительность ЦП действительно страдает. Некоторые шаги для изоляции проблемы:
контролируйте систему, в то время как использование ЦП пронзает вершину использования. Подтвердите, что использование ЦП от Java. (К сожалению, Вы не можете быть более точными, чем это).
контролируйте использование размера "кучи" с VisualVM или JConsole. Нормальное поведение состоит в том, чтобы видеть размер "кучи", постепенно увеличивающийся, затем внезапно пронзив вниз, когда GC умирает (пилообразный шаблон). Если использование памяти остается высоким, оно не может быть собрано "мусор"
это может быть очевидно, но проверяет Ваши журналы на OutOfMemoryExceptions
Удостоверьтесь, что Ваша VM использует макс. возможный размер "кучи". Для JVM на 32 бита это - 1400 или 1500M. Используйте опцию-xmx1500m JVM.
Удостоверьтесь, что ОС не использует много памяти подкачки (сверьтесь главный или свободный). Удостоверьтесь, что это имеет соответствующую память для выполнения Linux, и Tomcat (3 или 4 ГБ хорошее начало для машины на 32 бита).
Еще одно примечание - рассматривает Ваше заявление на утечки соединения и память. Spring будет заботиться о большой части этого для Вас. Удостоверьтесь, что Вы не помещаете материал в объект HttpSession (или карта на Сессии), который не должен быть там. Если Вы делаете какой-либо прямой JDBC или обработку файла, удостоверьтесь все потоки, Соединения и PreparedStatements (это - то, что я всегда забываю), закрываются.
Это может быть сделано со сценарием удара, который выполняет следующие задачи:
tail -f
, запись вывода к буферному местоположению.Я использовал бы единственный сценарий, возможно, запущенный как в init сценарии, а не задании крона. Например:
#!/bin/bash
RECIPIENT=root
SUBJECT="Log monitor"
PERIOD=5 # Harvest log buffer every PERIOD seconds
# Prepare the log buffer and ensure it is empty
LOGBUFFER=/tmp/logbuffer.$$
cp /dev/null $LOGBUFFER
# Monitor the log files in the background.
# More than one log file can be specified on the command line.
for file in "$@"; do
tail -f -n0 "$file" | while read line;do echo "$file: $line";done >> $LOGBUFFER &
done
# Harvest the log buffer
while :;do
if [ -s $LOGBUFFER ]; then
mail -t "$RECIPIENT" -s "$SUBJECT" < $LOGBUFFER
cp /dev/null $LOGBUFFER
fi
sleep $PERIOD
done
Сценарий не прекрасен (например, он оставит a /tmp/logbuffer.123
файл, лежащий вокруг, когда это выходит), но это должно запустить Вас.
Вы могли испытать Tenshi. Это записано в Perl, очень легком настраивать, и делает точно, что Вы запросили. Из описания пакета Ubuntu:
"Tenshi является программой мониторинга журнала, разработанной для наблюдения одного или нескольких файлов журнала за строками, соответствующими определяемым пользователем регулярным выражениям и отчету о соответствиях. Регулярные выражения присвоены очередям, которые имеют аварийный интервал и список адресатов".
Если Вы рассмотрели бы переключение на использование системного-журнала-ng, можно настроить его для автоматического запуска сценария оболочки, который может инициировать электронное письмо на основе шаблона сообщения системного журнала. Я имею в распоряжении это для входа безопасности.
вызов кроном каждые 5 секунд
Крон не имеет гранулярности меньшей, чем минуты. Если Вы захотите такую гранулярность, то Вам будет нужен incrond. Просто имейте что-то как:
/var/log IN_CLOSE_WRITE /usr/local/sbin/notify.sh $@/$#
и сценарий, что письма Вам:
tail $1 | mail -s "New lines in: $1" root
Вам, возможно, придется играть вокруг с правильными видами событий. Но это сделает ненужным запустить сценарий синхронизированным способом. Если у Вас есть incrontab, настроенный правильно, можно быть уверены, что что-то изменится каждый раз, когда сценарий запускается.