Запись в двух местах не работает - PullRequest
2 голосов
/ 23 марта 2011

Я чувствую, что это возможно, но я могу заставить log4net одновременно обращаться только к одному аппендиру.

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="false">
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Logs\webclient\Admin.Web\logs\admin.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMdd" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <appender name="TraceAppender" type="log4net.Appender.TraceAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
  </appender>

  <!--Database appender-->
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="10" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    <connectionString value="Data Source=(localhost); Database=Error_Logs; Persist Security Info=True;User ID=;Password=" />
    <commandText value="INSERT INTO [GeneralServiceLog] ([dtLog],[vchLevel],[vchLogger],[vchMessage],[vchException])
     VALUES( @log_date, @log_level, @logger, @message, @ex)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout" value="%level" />
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout" value="%logger" />
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout" value="%message" />
    </parameter>
    <parameter>
      <parameterName value="@ex" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>
  <root>
    <level value="ERROR" />
    <appender-ref ref="AdoNetAppender" />
  </root>
  <Logger>
      <level value="DEBUG" />
      <appender-ref ref="RollingLogFileAppender" />
  </Logger>    
</log4net>

Я хочу, чтобы сообщения уровня ERROR отправлялись в базу данных, а сообщения уровня DEBUG -в текстовый файл, но все сообщения просто собираются в файл.

Что мне не хватает?

Спасибо!

1 Ответ

4 голосов
/ 23 марта 2011

Вам необходимо настроить корневой регистратор следующим образом:

<root>
   <level value="DEBUG" />
   <appender-ref ref="AdoNetAppender" />  
   <appender-ref ref="RollingLogFileAppender" />
</root>  

, затем добавить фильтр к аппендеру базы данных:

<filter type="log4net.Filter.LevelRangeFilter">
   <levelMin value="ERROR" /> 
   <levelMax value="FATAL" />      
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

Обновление: Проблема с вашей конфигурацией заключается в том, что вы назначаете приложение db appender на неназванный регистратор, и, следовательно, ваш appender, по всей вероятности, никогда не будет вызван.В log4net вы можете назначить дополнения для регистраторов , но не для уровней.

...