LINUX.ORG.RU

log4j/log4cxx + async


0

0

Я использую log4cxx (клон log4j) и все бы хорошо, но в частности я пишу в лог ip адрес. Необходимо теперь еще дополнительно к ip адресу писать в лог DNS адрес.

К сожалению DNS resolving это долгая песня, поэтому хочется это дело обернуть в отдельный трэд.

Но не совсем понятно как это сделать. Есть AsyncAppender, но примеры какие-то не те:

http://www.java2s.com/Code/Java/Language-Basics/log4jasynchronouslog.htm

Таким образом я асинхронично gethostbyaddr не сделаю. Я так понимаю что AsyncAppender'у нужно передать LogginEvent который уже сделает gethostbyaddr, но как-то не совсем понятно как это сделать...

Может кто-нибудь сталкивался с подобной задачей?

Вынеси определение имени в отдельный метод/функцию с кешированием в хэш-таблице. Будет долго резолвиться первый раз. Можно через некоторое время имя инвалидировать

mv ★★★★★
()
Ответ на: комментарий от mv

А если DNS сервер упадет? Клиенты будут ждать реквеста пока мой логгер мучается с gethostbyaddr? Ерунда получается..

Посмотрел в коды log4cxx и вижу что важны методы

AppenderSkeleton::doAppend(LoggingEventPtr) которая зовет виртуальную append(LoggingEventPtr), которая в свою очередь в AsyncAppender добавляет LoggingEvent в очередь.

Все это конечно чудесно, но LogginEvent уже в себе имеет String message и методы которые зовутся в AsyncAppender в другом трэде это getMessage/getRenderedMessage, а эти методы нифига не виртуальные в LoggingEvent.

Ерунда получается немного. Легко асинхронично писать в лог котовые String message, но трудно асинхронично формировать эти самые String message.

Пока единственное что приходит в голову это сделать собственый трэд с очередью на gethostbyaddr.

dissident ★★
() автор топика
Ответ на: комментарий от dissident

> А если DNS сервер упадет? Клиенты будут ждать реквеста пока мой логгер мучается с gethostbyaddr? Ерунда получается..

Кэш в отдельном треде набивай

> Пока единственное что приходит в голову это сделать собственый трэд с очередью на gethostbyaddr.

Скажи честно, тебе в кишках log4cxx охота копаться? ;)

mv ★★★★★
()
Ответ на: комментарий от mv

> Кэш в отдельном треде набивай
Если будет трэд то в принципе неважно есть кэш или нет особо. ИМХО конечно.

> Скажи честно, тебе в кишках log4cxx охота копаться? ;)
А с какого бодуна я тогда его вообще использую если такие вещи приходится делать руками. :-\

dissident ★★
() автор топика
Ответ на: комментарий от dissident

> Если будет трэд то в принципе неважно есть кэш или нет особо. ИМХО конечно.

А ты тред на добавление сообщений в лог хочешь или тред для резолвера?

Я бы сделал так: вызываем свою функцию резолвинга для адреса, если в хэше записи нет, то делаем пустую запись (вставляем ключ), в лог пишем только голый ip. В отдельном треде раз в какое-то время проходимся по хэшу, для всех пустых записей резолвим имя. Ну ещё можно инвалидацию делать время от времени для старых записей, если сервер расчитан на работу без перезапусков месяцами. Если имя в логе позарез нужно, то резолвить сразу.

> А с какого бодуна я тогда его вообще использую если такие вещи приходится делать руками. :-\

Ну концепция у log4j ничё так, вполне интересная.

mv ★★★★★
()
Ответ на: комментарий от mv

> А ты тред на добавление сообщений в лог хочешь или тред для резолвера?
Для резолвера - я пишу в файл и это относительно быстро.

Ладно напишу собственный трэд который читает очередь записей для лога и формирует String message, резолвя (во слово-то..) адрес.

Жалко что Layout'ы накладываются перед AsyncAppender::append().. Если бы накладывались позднее - достаточно было бы написать свой Layout с резолвингом.

dissident ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.