2010-01-07 16 views
23

W mojej aplikacji używam log4net, a wszystkie typy tworzą własny rejestrator w oparciu o ich typ - np. :Czy jest możliwe stosowanie wieloznacznych nazw rejestratorów w konfiguracji log4net?

private static readonly ILog Log = LogManager.GetLogger(typeof(Program)); 

Jak Zajmuję zostawiam rejestratora korzeniowy na DEBUG tak aby złapać wszystkie wyjścia dziennika z mojego kodu.

Jednak składnik osoba trzecia używa również tego samego podejścia, ale generuje 100s komunikatów dziennika drugie, żaden z którego jestem zainteresowany.

Czy można użyć jakiegoś symboli wieloznacznych w rejestratorze konfiguracji, aby zmusić wszystkie swoje rejestratory do logowania się tylko w WARN, np :

<logger name="com.thirdparty.*"> 
    <level value="WARN"/> 
    </logger> 

[Dokładna powyższym przykładzie, za pomocą * nie działa]

Odpowiedz

34

można określić tylko część przestrzeni nazw, więc będzie mieć zastosowanie do wszystkich komunikatów wewnątrz tej przestrzeni nazw (w tym zagnieżdżone).

Oto przykład często używam:

<root> 
    <level value="FATAL" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

    <logger name="MyCompany.Web" > 
    <level value="WARN" /> 
    <appender-ref ref="WebErrors" /> 
    </logger> 

    <!-- Will log all FATALs from NHibernate, including NHibernate.SQL and all the nested --> 
    <logger name="NHibernate" > 
    <level value="FATAL" /> 
    </logger> 

Dodatkowo polecam zapoznać się z instrukcją. Zapewnia wiele wyjaśnień. Na przykład możesz przeczytać o Logger Hierarchy. Oto cytat stamtąd:

Rejestrator mówi się, że przodkiem innego rejestratora, jeśli jego nazwa następnie kropka jest przedrostek nazwy rejestratora potomek . Mówi się, że rejestrator jest rodzicem nadrzędnym rejestratora potomnego, jeśli istnieje brak przodków między nim a urządzeniem potomnym potomka . Hierarchia działa w taki sam sposób, jak przestrzeń nazw i hierarchia klas w .NET.

a ponadto:

Poziom spadków: odziedziczone poziomu dla danego rejestratora X jest równa pierwszej nie zerowym poziomie hierarchii rejestrator , zaczynając od X i przechodzenie w górę w hierarchii w kierunku głównego programu rejestrującego.

+0

@Dmitriy - Masz rację. Nie zdawałem sobie z tego sprawy! Niemal czuję się głupio, że teraz pytam :). Dziękuję za odpowiedź. –

+0

Wow, ja też. To wspaniała informacja. –

+0

BTW, wszystko to jest dobrze udokumentowane na stronie log4net. Dodałem link do odpowiedzi. –

4

nie można zrobić przeciwieństwo tego, co pytasz. Mam na myśli tylko ustawienie domyślnego poziomu dziennika na warn, a następnie ustawienie określonych rejestratorów, które zdefiniowałeś, na DEBUG.

Możesz również ustawić próg twojego appendera na DEBUG, a drugi appender ustawić WARN.

Na przykład:

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
    <applicationName value="Application" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    <threshold value="WARN" /> 
</appender> 

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Notification" /> 
    <smtpHost value="server01" /> 
    <bufferSize value="1" /> 
    <lossy value="false" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" /> 
    </layout> 
    <threshold value="DEBUG" /> 
</appender> 
+0

@Brian - Dzięki za odpowiedź. Tak - mogę * ale * problem polega na tym, że mam wiele typów. Podejście białej listy do rejestrowania sprawiłoby, że moja konfiguracja logowania byłaaby ogromna i nieporęczna, dlatego zastanawiałem się nad podejściem polegającym na stosowaniu czarnej listy. –

+0

Zrozumiano. Podałem tylko możliwe podejście w zależności od tego, ile zdefiniowałeś innych rejestratorów. Zaktualizowałem swoją odpowiedź, aby zaproponować zdefiniowanie progu na poziomie aplikanta. Następnie po prostu zmień bibliotekę zewnętrznego dostawcy, aby użyć appendera z odpowiednim progiem, podczas gdy twój appender nadal jest ustawiony na DEBUG. –

+0

@Brian - dzięki za sugestię w każdym przypadku - to dobre podejście, jeśli masz tylko kilka rejestratorów. Jeśli chodzi o twoją drugą część sugestii - w moim przypadku chcę, aby obie przeszły do ​​tego samego celu (pojedynczego pliku dziennika lub okna konsoli). Czy to podejście nadal by tam działało? –

Powiązane problemy