2009-09-03 12 views
98

Chciałbym napisać log do 2 różnych plików dziennika z tego samego procesu.Skonfiguruj Log4net do zapisu w wielu plikach.

jest to możliwe do zrobienia za pomocą log4net?

Potrzebuję napisać osobne wiadomości do każdego pliku dziennika. jak mogę napisać wiadomość do konkretnego aplikanta?

+3

Nie możesz zalogować się do oddzielnych aplikatorów - musisz skonfigurować różne rejestratory i dołączyć do każdego z nich odpowiedniego programistę. Następnie zaloguj różne komunikaty do różnych rejestratorów. –

+0

Oto jak to zrobiłem z konfiguracją kodu: http://stackoverflow.com/questions/27846157/configure-log4net-to-write-to-different-log-files-no-config-files –

Odpowiedz

67

Tak, wystarczy dodać wiele FileAppenders do rejestratora. Na przykład:

<log4net> 
    <appender name="File1Appender" type="log4net.Appender.FileAppender"> 
     <file value="log-file-1.txt" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date %message%newline" /> 
     </layout> 
    </appender> 
    <appender name="File2Appender" type="log4net.Appender.FileAppender"> 
     <file value="log-file-2.txt" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date %message%newline" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="File1Appender" /> 
     <appender-ref ref="File2Appender" /> 
    </root> 
</log4net> 
+2

Nice .. :) jednak będę musiał napisać oddzielne wiadomości do każdego pliku dziennika. jak mogę napisać wiadomość do konkretnego aplikanta? dzięki. oferuje – ofer

+2

@- zobacz moją odpowiedź na pytanie, jak to zrobić. – RichardOD

+0

Co jeśli chcesz, aby File1Appender logował błędy DEBUG i File2Appender, aby rejestrować błędy ERROR? – JsonStatham

51

Vinay ma rację. W odpowiedzi na Twój komentarz w jego odpowiedzi, jeden sposób możesz to zrobić:

<root> 
    <level value="ALL" /> 
    <appender-ref ref="File1Appender" /> 
</root> 
<logger name="SomeName"> 
    <level value="ALL" /> 
    <appender-ref ref="File1Appender2" /> 
</logger> 

Tak właśnie zrobiłem to w przeszłości. Wtedy coś takiego dla innych dzienniku:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName"); 

I można dostać normalne rejestrator następująco:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

Przeczytaj sekcję loggers and appenders dokumentacji, aby zrozumieć jak to działa.

+3

Mam to samo * ustawienie w jednej z moich aplikacji i to nie działa dla mnie :( –

+0

Dzięki, pracowałeś jak czar – VoodooChild

+0

Ta dyskusja jest bardzo stara ... mam nadzieję, że możesz odpowiedzieć ... Próbowałem Twojego podejścia, ale dwaj loggery logują te same wiadomości, jak w log.Info ("") i innych blogach .Info ("") zapisuje komunikaty jednocześnie do obu plików dziennika – SutharMonil

145

Odpowiedzi te były pomocne, ale chciałem podzielić się moją odpowiedzią zarówno z częścią app.config, jak iz częścią kodu C#, więc mniej osób zgaduje dla następnej osoby.

<log4net> 
    <appender name="SomeName" type="log4net.Appender.RollingFileAppender"> 
    <file value="c:/Console.txt" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Composite" /> 
    <datePattern value="yyyyMMdd" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="1MB" /> 
    </appender> 
    <appender name="Summary" type="log4net.Appender.FileAppender"> 
    <file value="SummaryFile.log" /> 
    <appendToFile value="true" /> 
    </appender> 
    <root> 
    <level value="ALL" /> 
    <appender-ref ref="SomeName" /> 
    </root> 
    <logger additivity="false" name="Summary"> 
    <level value="DEBUG"/> 
    <appender-ref ref="Summary" /> 
    </logger> 
</log4net> 

Następnie w kodzie:

ILog Log = LogManager.GetLogger("SomeName"); 
ILog SummaryLog = LogManager.GetLogger("Summary"); 
Log.DebugFormat("Processing"); 
SummaryLog.DebugFormat("Processing2")); 

Tutaj c: /Console.txt będzie zawierać "przetwarzanie" ... i \ SummaryFile.log będzie zawierać "Processing2"

+41

Po prostu chciałem zwrócić uwagę na atrybut addytywności = "false" w rejestratorze, który uniemożliwia rejestrowanie wszystkiego w katalogu głównym. –

+1

To doskonały przykład na moc log4net. Dzięki! – crush

+1

dziękuję bardzo, dla ciebie – Zaragon

33

Chciałem aby rejestrować wszystkie wiadomości w dzienniku głównego i mieć osobny dziennik z błędami, oto, jak można to zrobić:

<log4net> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="allMessages.log" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date %-5level %logger - %message%newline" /> 
     </layout> 
    </appender> 

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender"> 
     <file value="errorsLog.log" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date %-5level %logger - %message%newline" /> 
     </layout> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="ERROR" /> 
      <levelMax value="FATAL" /> 
     </filter> 
    </appender> 

    <root> 
     <level value="ALL" /> 
     <appender-ref ref="FileAppender" /> 
     <appender-ref ref="ErrorsFileAppender" /> 
    </root> 
</log4net> 

Zwróć uwagę na użycie elementu filtrującego.

0

Zastosowanie poniżej konfiguracji XML skonfigurować dzienniki na dwie lub więcej plików,

<log4net> 
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="logs\log.txt" />   
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout">   
     <conversionPattern value="%date [%thread] %level %logger - %message%newline" /> 
     </layout> 
    </appender> 
    <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender"> 
     <file value="logs\log1.txt" />   
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout">   
     <conversionPattern value="%date [%thread] %level %logger - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="All" /> 
     <appender-ref ref="RollingLogFileAppender" /> 
    </root> 
    <logger additivity="false" name="RollingLogFileAppender2"> 
    <level value="All"/> 
    <appender-ref ref="RollingLogFileAppender2" /> 
    </logger> 
    </log4net> 

Przede dzienników konfiguracyjnym XML w dwóch różnych plikach.

Aby uzyskać konkretną instancję rejestratora programowo

ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2"); 

można dodać dwa lub więcej elementów appender log4net wewnątrz elementu głównego do logowania do plików wielokrotności.

Więcej informacji o powyższej konstrukcji konfiguracyjnym XML lub appender która jest najlepsza dla twojej aplikacji, przeczytaj szczegół z linku poniżej,

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html

nadzieję, że pomoże.

Powiązane problemy