Способ 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>