Адаптивный app4 log4j, который игнорирует директивы журнала под нагрузкой - PullRequest
2 голосов
/ 30 января 2012

У меня есть определенная категория журнала, которая - в случае «высокой нагрузки» я бы предпочел не регистрировать.

Данные журнала записываются в файловую систему, поэтому в этом сценарии я бы определил «высокую нагрузку» как файл, растущий со скоростью, превышающей определенный порог с течением времени.

Существует ли существующий appender, который может распознать, что файл растет слишком быстро, а затем игнорировать директивы журнала?

Если нет, то входит ли это в число пользовательских приложений?

1 Ответ

1 голос
/ 24 октября 2012

К сожалению, не существует существующего приложения log4j, которое могло бы сделать это.

Однако можно было бы разработать собственный приложение (например, как подкласс существующего приложения).Он должен был бы отслеживать его пропускную способность и соответственно отбрасывать сообщения.

У пользовательского подхода к аппендеру есть два предостережения:

  1. В более крупной системе аппендер будет работатьна сервере журналов Log4J, а не в вашем приложении.Приложение будет отправлять сообщения на сервер журналов, который впоследствии вызывает приложение для сохранения (в файле, базе данных и т. Д.).Теперь основное усилие здесь состоит в том, чтобы доставить сообщение на сервер журналов, поэтому удаление сообщения на сервере журналов будет огромной тратой ресурсов.Вместо этого вам придется отказаться от него на стороне клиента (то есть в вашем приложении).

  2. Построение сообщения иногда дорого (создание объектов, строк, параметризованных сообщений, сбор статистики)., измерьте время и т. д.).Опять же, это пустая трата ресурсов, чтобы сделать это, если бы аппендер отбросил результаты.

Тем не менее, это может быть сделано.должен был бы быть подклассом SocketAppender, чтобы сетевые издержки не тратились впустую.
Во-вторых, appender должен был бы предложить очень эффективный способ для приложения выяснить, отбрасываются ли сообщения в настоящее время.Затем в своем приложении вы можете написать эффективный код, например:

if (MyLogHelper.isActuallyLogging(LOGGER, Level.DEBUG)) {
    LOGGER.debug(constructExpensiveMessage());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...