Вход в многопоточное приложение в Java - PullRequest
8 голосов
/ 24 июня 2010

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

Ответы [ 3 ]

6 голосов
/ 24 июня 2010

Вы можете попробовать использовать пользовательское приложение Log4J, которое принимает идентификатор потока в качестве параметра и фильтрует сообщения в зависимости от того, какой поток его вызывает. Создайте его на лету, прикрепите к регистратору.

Есть несколько проблем с этим подходом:

  1. Слишком много приложений замедлило бы регистрацию
  2. Серверы приложений обычно имеют пул потоков. Это означает, что один и тот же поток с течением времени будет участвовать в выполнении совершенно не связанных запросов, которые в конечном итоге окажутся в том же файле журнала.

Я предлагаю вам рассмотреть более простой подход: записать идентификатор потока в тот же файл журнала. Это быстро и просто, log4j имеет флаг% для этого. Позже вы можете выполнить grep / split файл журнала по идентификатору потока, если это необходимо.

Обновление

На самом деле, у вас может быть один пользовательский appender, который будет открывать файлы журнала по требованию, когда новый поток регистрирует запись (appender выполняется в контексте этого потока, просто вызовите Thread.currentThread (). GetName ()). Но вам придется заново реализовать все обычные задачи файла журнала (ротация) или делегировать его стандартному приложению для каждого файла.

4 голосов
/ 24 июня 2010

У меня есть многопоточное приложение, которое идентифицирует каждый поток в файле журнала (не знаю о файлах Mutliple, один файл показывает мою совпадение), определение потока выполняется автоматически каркасом ведения журнала, это Log4J

Редактировать: Ничего не нужно добавлять в коде, вы просто настраиваете appender в регистраторе, чтобы включить [% Thread], который будет идентифицировать поток, из которого вы регистрируете текущее сообщение, это пример из log4net:

<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>

Вот список других распространенных Java logging frameworks

1 голос
/ 26 июня 2010

В некоторых случаях знание идентификатора потока гораздо менее важно, чем знание контекста выполнения.Это особенно верно для множества потоков и более крупных приложений.Что вы делаете, когда меняется идентификатор потока, но фактический контекст выполнения фактически такой же (как кто-то упоминал с пулами потоков)?Я бы предпочел использовать MDC (сопоставленный диагностический контекст) для отслеживания контекста выполнения в журналах.Это лучше, потому что вы контролируете контекст.В конце вы можете установить макет журналов, чтобы включить MDC, а затем легко отфильтровать то, что имеет значение.Проверьте этот инструмент , с MDC он делает довольно много вещей.

...