Logback untuk mencatat pesan yang berbeda ke dua file

147

Saya menggunakan logback / slf4j untuk melakukan pendataan saya. Saya ingin mem-parsing file log saya untuk menganalisis beberapa data, jadi alih-alih mem-parsing file besar yang besar (kebanyakan terdiri dari pernyataan debug) Saya ingin memiliki dua instance logger yang masing-masing log ke file yang terpisah; satu untuk analitik dan satu untuk semua tujuan logging. Adakah yang tahu apakah ini mungkin dengan Logback, atau pencatat lain dalam hal ini?

Aly
sumber

Jawaban:

297

Sangat mungkin untuk melakukan sesuatu seperti ini di logback. Berikut contoh konfigurasi:

<?xml version="1.0"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
        <file>analytics.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- additivity=false ensures analytics data only goes to the analytics log -->
    <logger name="analytics" level="DEBUG" additivity="false">
        <appender-ref ref="ANALYTICS-FILE"/>
    </logger>
    <root>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

Kemudian Anda akan menyiapkan dua penebang terpisah, satu untuk semuanya dan satu untuk mencatat data analitik seperti:

Logger analytics = LoggerFactory.getLogger("analytics");
ig0774
sumber
1
Saya perlu melakukan hal semacam ini sehingga saya dapat memiliki append baris makan dan append reguler untuk file yang sama. Terima kasih atas info ini.
Djangofan
Additivity IMO = false harus default jika appender-ref berbeda ditentukan. Sangat sering kita mendapatkan aplikasi di mana beberapa modul akan menjadi generator log yang sangat sering karena beberapa peristiwa pengatur waktu, dan kami ingin memisahkan log-log itu menjadi file yang berbeda. Masuk log yang sama di 10 file yang berbeda benar-benar tidak masuk akal. Jadi seharusnya fitur opt in tidak default. Karena logback adalah penulisan ulang, kesalahan yang sama seharusnya diperbaiki oleh penulis yang sama.
samarjit samanta
Saya ingin mencatat kesalahan, men-debug, pesan info dalam file yang berbeda masing-masing. Apakah mungkin dengan logback.xml
Qasim
@Qasim - itu mungkin. Lihat - amitstechblog.wordpress.com/2014/09/27/…
Andy Dufresne
Saya mencoba untuk mencatat log dari paket yang berbeda ke file yang berbeda seperti jawaban ini menyarankan tetapi itu tidak berhasil untuk saya. Ekstrak xml logback saya ada di sini - pastebin.com/Aii4f1Jk . Saya mencoba untuk login paket hibernasi tingkat TRACE log ke file yang berbeda. Ada saran?
Andy Dufresne
7

Anda dapat memiliki penebang sebanyak yang Anda inginkan. Tapi, lebih baik Anda memiliki satu untuk setiap paket yang Anda perlu login secara berbeda. Kemudian semua kelas dalam paket itu dan sub-paketnya akan mendapatkan logger khusus itu. Mereka semua dapat berbagi logger root dan mengirim data log mereka ke root logger appender menggunakan additivity = "true". Ini sebuah contoh:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern>
    </encoder>
</appender>

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/worker.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/transformer.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true">
    <appender-ref ref="xyz"/>
</logger>

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true">
    <appender-ref ref="abc"/>
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
</root>

AraT
sumber
2

dalam kasus saya, saya ingin meninggalkan nama kelas sebagai nama log

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);

dan karena saya memiliki beberapa kelas seperti itu, jadi saya logback.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more -->
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
panser
sumber