Как войти в отдельные файлы на поток с Log4Net? - PullRequest
6 голосов
/ 23 октября 2009

Мое приложение использует несколько потоков с четко определенными именами (то есть не пул потоков с «анонимными» потоками). В настоящее время все эти потоки отправляют свои сообщения журнала в один файл - и хотя идентификатор потока является частью строки журнала, это очень затрудняет анализ поведения приложения. Таким образом, я хочу, чтобы каждый поток входил в свой собственный файл журнала.

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

1 Ответ

4 голосов
/ 23 октября 2009

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

Поскольку идентификатор потока не является детерминированным, вам понадобится что-то еще, чтобы выполнить фильтрацию. Я предполагаю, что вы сами контролируете создание этих потоков и предлагает, чтобы каждый поток регистрировал идентификатор в свойстве в ThreadContext . Затем вы можете использовать PropertyFilter для фильтрации сообщений на основе идентификаторов.

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

<appender name="x">
    <filter type="log4net.Filter.Property">
        <key value="threadId" />
        <stringToMatch value="threadX" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    ...
</appender>

<appender name="y">
    <filter type="log4net.Filter.Property">
        <key value="threadId" />
        <stringToMatch value="threadY" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    ...
</appender>

<root>
    <appender-ref name="x" />
    <appender-ref name="y" />
</root>
...