2009-09-07 10 views
41

Chcę przesłać poziom informacji & powyżej do aplikacji pobierającej dane XML i poziomu błędu/krytycznego do aplikacji dołączającej zdarzenia EventLog.Skonfiguruj log4net, aby wysyłać błędy do różnych aplikacji na poziomie

Gromadzę, że muszę zmodyfikować element główny konfiguracji, ale mam problemy ze składnią. Jaka jest składnia konfiguracji do kierowania dzienników do właściwego aplikanta dla danego poziomu lub zakresu poziomów?

Jest to konfiguracja tej pory:

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 

Edit: Dzięki @agileguy. Ten post rzeczywiście zawierał składnię, której potrzebowałem. Działające rozwiązanie wygląda teraz tak:

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="INFO"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="INFO" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ERROR"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="ERROR" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 
+5

pamiętać, że oceniający jest używany tylko przez appenders które obsługują buforowanie. Jeśli chcesz określić konkretny poziom dla appendera, musisz użyć tylko elementu - nie trzeba go zawijać w ewaluatorze. – Brian

+0

element powinien być używany tylko w aplikacjach implementujących BufferingAppenderSkeleton (tzn. Nie RollingFileAppender). – dave

+0

Myślę, że artykuł pana Grahama [tutaj] (http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx) pomoże ci. –

Odpowiedz

6

Możesz ustawić inną wartość progu dla każdego aplikanta. Wszystkie zdarzenia dziennika o niższym poziomie niż poziom progowy są ignorowane przez aplikanta. Wklejam poniżej dwaj aplikanci, jeden dla plików i drugi dla bazy danych (powinieneś ustawić ciąg połączenia). Appender bazy danych ma właściwość progową wskazującą, że tylko błędy będą zapisywane w bazie danych.

<configuration> 
    <log4net> 
    <!--Database appender--> 
    <appender name="DbAppender" type="log4net.Appender.ADONetAppender"> 
     <bufferSize value="0" /> 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <connectionString value="Data Source=AEG-PC\SQLEXPRESS;Initial Catalog=JCZ6;Uid=sa;Pwd=qwerty;" /> 
     <commandText value="INSERT INTO Log4Net ([date],[thread],[level],[logger],[message],[exception]) VALUES 
     (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 
     <parameter> 
     <parameterName value="@log_date" /> 
     <dbType value="DateTime" /> 
     <layout type="log4net.Layout.RawTimeStampLayout" /> 
     </parameter> 
     <parameter> 
     <parameterName value="@thread" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%t" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@log_level" /> 
     <dbType value="String" /> 
     <size value="10" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%p" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@logger" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%c" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@message" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%m" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@exception" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.ExceptionLayout" /> 
     </parameter> 
     <threshold value="Error" /> <!--THIS IS THE IMPORTANT LINE--> 
    </appender> 
    <!--File appender--> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="log-file.txt" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="FileAppender" /> 
     <appender-ref ref="DbAppender" /> 
    </root> 
    </log4net> 
</configuration> 
13

Można to zrobić za pomocą threshold lub filter elementy wewnątrz appender.

Należy pamiętać, że próg może znajdować się bezpośrednio pod aplikatorem, gdzie działa jako filtr zintegrowany lub pod numerem evaluator, np.

<evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="ERROR"/> 
</evaluator> 

gdzie działa jako filtr obejmujący pomijanie buforowania (natychmiastowe wyjście), jeśli dotyczy.



Pełne wyjaśnienie (source):

<threshold value="ERROR" /> 

próg został wdrożony w AppenderSkeleton a zatem obsługiwany przez prawie wszystkie appenders. Jest to prosty test, który jest używany do ignorowania zdarzeń rejestrowania, które mają poziom poniżej progu. Próg jest sprawdzany wcześnie i jako prosty test jest bardzo wydajny: .

Istnieje inny sposób określenia tego samego zachowania, co próg przy użyciu filtrów. Filtry są znacznie bardziej elastyczne, a ponieważ można je podłączyć, można również opracować własną niestandardową logikę i wstawić ją do łańcucha filtrów .

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

Podobnie jak Filtry wyboru Próg są realizowane w klasie bazowej AppenderSkelton i są obsługiwane przez prawie wszystkich appenders. Powyższy filtr ma taki sam efekt jak <threshold value="ERROR" />. Jest to LevelRangeFilter, który pozwala na dowolne zdarzenia o poziomie w zakresie od ERROR do OFF (włącznie). Zauważ, że OFF to nazwa najwyższego poziomu, a odwrotnie: ALL to nazwa najniższego poziomu.

Filtry posiadają dużą elastyczność, ponieważ wiele filtrów może być przykuty razem, aby zapewnić drobnoziarnista kontrolę nad wydarzeniami że są wyprowadzane. Z tego powodu mają również wyższy koszt pod względem wydajności, każdy filtr w łańcuchu jest obiektem i jest proszony o to, aby zadecydować o właściwym sposobie działania. W prostym przypadku filtrowania wartości progowych właściwość Threshold powinna być używana w preferencji względem filtru w .

The Evaluator jest realizowany przez BufferingAppenderSkeleton i zatem obsługiwane tylko przez appenders, które rozciągają się do tej klasy bazowej oraz wsparcie dla buforowania. SmtpAppender jest jednym z takich aplikatorów .

Evaluator jest wtykany obiekt, który jest używany przez BufferingAppenderSkeleton określić, czy rejestrowanie zdarzeń nie powinno być buforowane, lecz napisany/wysłany natychmiast. Jeśli oceniający zdecyduje, że zdarzenie jest ważne, wówczas cała zawartość bieżącego bufora zostanie wysłana wraz ze zdarzeniem. Ewaluator nie działa tak jak próg lub filtr, ponieważ nie odrzuca zdarzeń.

1

Miałem to samo pytanie. Okazuje się, zakładając, że rozumiem pierwotne pytanie, że progi te nie będą działać, ponieważ będą przesyłać określone wyniki do jednego aplikanta i to plus resztę do innego aplikanta. Udało mi się uruchomić go przy użyciu LevelRangeFilter, jak zasugerowano powyżej. Chciałem BŁĘDÓW, INFO i WARN, aby przejść do jednego aplikanta i wszystkich innych, aby przejść do innego aplikanta, ale nie ERROR, INFO i WARN.

Oto config, który pracował dla mnie:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
     <appender name="LoggingAppender" type="log4net.Appender.FileAppender" > 
      <file value="logs.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="INFO"/> 
       <levelMax value="OFF"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <appender name="TracingAppender" type="log4net.Appender.FileAppender" > 
      <file value="traces.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="ALL"/> 
       <levelMax value="DEBUG"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <root> 
      <appender-ref ref="LoggingAppender"/> 
      <appender-ref ref="TracingAppender"/> 
     </root> 
    </log4net> 
</configuration> 

Dzięki Nick