2010-05-16 2 views
0

В моей программе у меня есть 2 отдельных потока событий регистрации (для их простоты называет их потоки, в действительности их 2 приложения). Stream1 содержит ведение журнала клиента, а Stream2 содержит ведение журнала контроля. Теперь это может показаться легким, за исключением того, что определенные классы могут быть как в протоколировании клиентов, так и при регистрации сервера, в зависимости от ситуации. Еще более усложняет тот факт, что команда, которую хочет клиент, имеет место в двух отдельных потоках (один из них случайным образом выбирается из пула потоков), поэтому любое отслеживание с помощью MDC или NDC невозможно.Наследовать приложения из вызывающего экземпляра в log4j или logback

Что действительно упростило бы это, если бы регистратор мог наследовать добавление от вызывающего экземпляра. Таким образом, я могу настроить 2 приложения для 2 регистраторов и сделать это. Однако я понятия не имею, как сделать это чисто или легко. Может ли кто-нибудь предложить какие-либо советы о том, как это сделать?

Примечание: Если что-то необходимо передать, у меня есть компонент событий, который передается ко всему в цепочке, который может быть использован в случае необходимости.

ответ

1

Вы уже упоминали, что обработка клиента происходит в нескольких потоках, поэтому простой способ ThreadLocal может не работать ... но работает ли ThreadGroupLocal?

См [Are there thread group-local variables in Java?

Такт я предлагаю, чтобы только один Appender, зарегистрированный в рамках регистрации. Этот приписка будет тем, что вы пишете. Реализация будет делегировать приложение ThreadLocal/ThreadGroupLocal. : appender будет специфичным для клиента или для управления.

Также обратите внимание, что ваш appender не должен настраиваться под асинхронными или пакетными абстракциями.

+0

Кажется, что я создавал бы пул для каждого запроса клиента, который разрушает точку объединения. В противном случае мне пришлось бы создать очень сложную систему ведения журнала с каждым потоком, имеющим установку MDC. Технически возможно, но абсолютно смешно. И мои надежды на использование трассировки стека были сбиты сегодня, когда я обнаружил, что трассировка не возвращается к вызывающему классу, что не удивительно. Подумайте о времени для этого пользовательского пула потоков, о котором я думал писать. – TheLQ

+0

Возвращение Я собираюсь отдать должное там, где это необходимо. Я нашел класс ThreadGroupLocal в Интернете и использовал единственное приложение, которое проверило локальную переменную. Он отлично работает, и я просто хочу сказать, спасибо! – TheLQ

Смежные вопросы