Konfigurasikan Log4net untuk menulis ke banyak file

130

Saya ingin menulis log ke 2 file log berbeda dari proses yang sama.

apakah itu mungkin dilakukan dengan menggunakan log4net?

Saya harus menulis pesan terpisah untuk setiap file log. bagaimana saya bisa menulis pesan ke appender tertentu?

ofer
sumber
3
Anda tidak dapat masuk ke append terpisah - Anda perlu mengkonfigurasi logger yang berbeda, dan melampirkan append yang sesuai untuk masing-masing. Kemudian catat pesan yang berbeda ke penebang yang berbeda.
Vinay Sajip
Inilah cara saya melakukannya dengan kode-sebagai-konfigurasi: stackoverflow.com/questions/27846157/…
Jay Sullivan

Jawaban:

82

Ya, cukup tambahkan beberapa FileAppenders ke logger Anda. Sebagai contoh:

<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>
Vinay Sajip
sumber
5
Bagus .. :) namun, saya harus menulis pesan terpisah untuk setiap file log. bagaimana saya bisa menulis pesan ke appender tertentu? Terima kasih. ofer
ofer
2
@ ofer- lihat jawaban saya tentang cara melakukan itu.
RichardOD
1
Bagaimana jika Anda ingin File1Appender mencatat kesalahan DEBUG dan File2Appender mencatat kesalahan ERROR?
JsonStatham
Saya mencoba mencapai hal serupa. Akan senang jika Anda dapat menjawab pertanyaan saya: stackoverflow.com/questions/24886364/…
Ashish Charan
202

Jawaban-jawaban ini sangat membantu, tetapi saya ingin membagikan jawaban saya dengan bagian app.config dan c # code, jadi tidak ada lagi tebakan untuk orang berikutnya.

<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>

Kemudian dalam kode:

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

Di sini c: /Console.txt akan berisi "Memproses" ... dan \ SummaryFile.log akan berisi "Processing2"

Gary
sumber
58
Saya hanya ingin meminta perhatian pada atribut additivity = "false" pada logger yang mencegah semuanya masuk ke root.
Jason Hernandez
1
Ini adalah contoh yang bagus dari kekuatan log4net. Terima kasih!
naksir
5
Konfigurasi di atas tidak ada <layout> ... </layout>, tanpanya saya tidak melihat pesan apa pun di file log.
CrnaStena
@CrnaStena Apakah Anda yakin itu satu-satunya perubahan yang Anda lakukan?
Gary
1
@Craig Lihat pertanyaan ini untuk lebih lanjut tentang menggunakan itu: stackoverflow.com/questions/1999382/…
Gary
60

Vinay benar. Sebagai jawaban atas komentar Anda dalam jawabannya, salah satu cara Anda dapat melakukannya adalah sebagai berikut:

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

Beginilah cara saya melakukannya di masa lalu. Maka sesuatu seperti ini untuk log lainnya:

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

Dan Anda bisa mendapatkan logger normal Anda sebagai berikut:

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

Baca bagian logger dan appenders dari dokumentasi untuk memahami cara kerjanya

RichardOD
sumber
3
Saya memiliki pengaturan yang sama ini di salah satu aplikasi saya dan itu tidak berfungsi untuk saya :(
Rom
1
Diskusi ini sudah sangat lama ... harap Anda dapat membalas ... Saya mencoba pendekatan Anda tetapi kedua penebang mencatat pesan yang sama. Seperti di log.Info ("") dan otherLog.Info ("") tulis pesan ke kedua file log secara bersamaan.
SutharMonil
1
@daniel_aren Ya, apa yang saya lakukan adalah saya menggunakan blok appender untuk membuat dua appenders dengan jalur file terpisah (seperti yang di atas ini) .... jadi secara efektif kita memiliki dua blok appender dengan nama: fileappender1 dan fileappender2 ... .
SutharMonil
1
@SutharMonil cukup tambahkan 'additivity = "false" ke node logger, seperti dalam jawaban oleh Gary dan disorot oleh Jason Hernandez. Dalam hal ini masih akan meletakkan semua pesan di root tetapi hanya pesan dari otherLog.Info ("") akan muncul di File1Appender2
freedomn-m
Sejauh ini jawaban yang paling akurat.
Fabricio
41

Saya ingin mencatat semua pesan ke root logger, dan memiliki log terpisah dengan kesalahan, berikut ini caranya:

<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>

Perhatikan penggunaan elemen filter.

Valentin Kuzub
sumber
0

Gunakan konfigurasi XML di bawah ini untuk mengonfigurasi log menjadi dua atau lebih file,

<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>

Log konfigurasi XML di atas menjadi dua file yang berbeda.

Untuk mendapatkan instance spesifik dari logger secara terprogram,

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

Anda bisa menambahkan dua atau lebih elemen appender di dalam elemen root log4net untuk masuk ke file banyak.

Info lebih lanjut tentang struktur konfigurasi XML di atas atau appender mana yang terbaik untuk aplikasi Anda, Baca detail dari tautan di bawah ini,

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

Semoga ini bisa membantu.

Rakesh Chaudhari
sumber