Log4Net - Как добавить второй регистратор, используемый только для определенных разделов кода - PullRequest
37 голосов
/ 01 марта 2011

Я использую Log4Net 2.0, у меня он работает как требуется, но для добавления другого регистратора для определенных операторов журнала. Все ведение журнала выполняется одним приложением. Изменение, которое я хочу сделать, заключается в том, что стороннее приложение запускает события, содержащие информацию об отладке / ошибках, я могу поймать эту информацию и, хотя она полезна, я считаю, что она загрязняет обычный файл журнала приложения, и вместо этого предпочла бы, чтобы она сохранялась в собственном журнале. файл.

Конечный результат, который я хотел бы получить, - это файл с именем log-file.txt со всеми журналами из приложения, кроме сторонних. И 2-й файл с именем log-file-3rdparty.txt с регистрацией только из стороннего приложения. Проблема, которую я имею, настраивает Log4Net, чтобы иметь 2 отдельных регистратора. Я уже пытался создать 2-й LogFileAppender и добавить его в корень, однако все это делает одинаковые операторы регистрации в обоих регистраторах.

По всему приложению в настоящее время у нас есть оператор GetLogger следующим образом. В идеале это должно оставаться неизменным, поэтому существующее ведение журнала не изменяется. Мне нужен новый регистратор, который не затронут этим оператором, а вместо этого создается исключительно для сторонних журналов.

private readonly ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

И App.Config следующим образом.

< log4net>
<logger name="MyApp.Logging">
  <level value="DEBUG"/>
</logger>

<root>
  <level value="ALL" />
  <appender-ref ref="LogFileAppender" />
</root>

<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
  <param name="File" value="log-file.txt" />
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="Header" value="&#13;&#10;[Application started]&#13;&#10;" />
    <param name="Footer" value="[Application Finished]&#13;&#10;"/>
    <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
  </layout>
</appender>
</ log4net>

Вы можете помочь?

EDIT

Если это имеет какое-либо значение. Сторонние события журнала регистрируются в том же классе, из которого также запускаются некоторые из событий журнала моего приложения, потому что класс отвечает за управление программным обеспечением третьей части. Это проблема? У меня есть некоторые предположения, что log4net может дифференцировать, какой регистратор создать на основе имен классов, и если это так, нужно ли мне реорганизовать регистрацию сторонних производителей в свой собственный класс?

1 Ответ

88 голосов
/ 01 марта 2011

Вы можете легко создать специальный регистратор, подобный этому:

ILog specialLogger = LogManager.GetLogger("SpecialLogger");

Затем вы можете настроить систему на использование выделенного приложения для этого регистратора:

<logger name="SpecialLogger" additivity="false">
   <level value="ALL" />
   <appender-ref ref="SpecialLogFileAppender" />
</logger>
<root>
   <level value="ALL" />
   <appender-ref ref="LogFileAppender" />
</root>
...