Мы используем Log4J с его SyslogAppender для отправки сообщений на центральный сервер syslog-ng, работающий на машинах Unix.
Есть ли способ (будь то в Java или в Unix) ограничить количество отправляемых сообщений, чтобы избежать сбоя сервера, который также нарушит работу сети?
Единственный вариант, о котором я могу думать, - это установить более высокий уровень журнала, чтобы на самом деле было отправлено меньше сообщений, но это не идеально, поскольку важные сообщения могут быть подавлены на машине, которая в противном случае ведет себя сама.
Я полагаю, что в идеальном мире динамически изменяющийся уровень был бы хорош: если количество сообщений в секунду превышает определенный уровень, порог повышается, но в то же время это звучит немного похоже на излишество.
Любые идеи?
Спасибо
Богатый
Я думаю, вопрос в том, неужели вас волнует, если вы не получите все свои журналы на центральном сервере? То, о чем вы говорите, по сути, отбрасывает сообщения - в этом случае вы потеряете журналы. Это нормально? Если это так, вы уже ответили на свой вопрос - поднимите уровень отладки, чтобы получать только те сообщения, которые вам действительно нужны.
Если, однако, вы пытаетесь соответствовать, скажем, ограничению пропускной способности (например, месячному пределу обработки Splunk), вам необходимо написать промежуточный сервер, чтобы брать журналы из syslog и определять их приоритетность. Это не сложно, но это очень специфично для вашего варианта использования. Одним из преимуществ этого метода является то, что этот посредник может немедленно отправлять важные журналы на сервер агрегации и в конце дня / месяца отправлять журналы с наивысшим приоритетом, которые не были отправлены изначально. Таким образом, вы сможете точно заполнить квоту.
Если вы добавите более конкретные требования (например, зачем вам это нужно), и что вы имеете в виду, ограничивая журналы (повторяющиеся строки? Пропускная способность? Пространство? Сервер агрегации не успевает? И т. Д.), То вы получите гораздо лучший ответ.
Удачи!
Если вы правильно используете log4j, использование более высокого уровня журнала не должно влиять на сообщения импорта, поскольку они должны иметь высокий уровень. Зарегистрируйте деталь локально с локальным вращением.
Единственное, что я знаю, что это близко к этому, - это конфигурация тихих сообщений, которые одинаковы, например, если сообщение журнала повторяется примерно 200 раз, вы можете попросить системный журнал записать его один раз и игнорировать другие и записать только сообщение, в котором говорится, что сообщение повторилось еще 199 раз. Регулирование журнала может привести к потере сообщений журнала, а это нежелательно.
Может быть, вы можете установить QOS / формирование трафика между вашим сервером и сервером журналов и использовать это для управления скоростью?
Если это проблема с пропускной способностью, как вы сказали, вы даже можете использовать сжатие (оно поддерживается в rsyslog, но я не уверен в syslog-ng). Кроме того, если вы не используете журналы для предупреждений в реальном времени, вы можете создать сценарий, который будет читать локальные журналы каждые несколько секунд и отправлять их сжатые агрегаты.
Если вам нужно распределенное решение, вы можете использовать предложение выше. (Экономит пропускную способность на многих ссылках). Но если вы предпочитаете что-то более централизованное (с немного большей потерей полосы пропускания, потому что вам нужно отправлять бесполезные журналы на промежуточный сервер), то решение Redmumba намного лучше.