Farklı mesajları iki dosyaya kaydetmek için tekrar oturum açın


147

Günlük kaydı yapmak için logback / slf4j kullanıyorum. Bazı verileri analiz etmek için günlük dosyamı ayrıştırmak istiyorum, bu nedenle büyük ve büyük bir dosyayı (çoğunlukla hata ayıklama ifadelerinden oluşan) ayrıştırmak yerine, her günlüğün ayrı bir dosyaya kaydedildiği iki günlükçü örneğine sahip olmak istiyorum; biri analitik ve diğeri çok amaçlı günlük kaydı için. Bunun Logback veya bu konuda başka bir kaydedici ile mümkün olup olmadığını bilen var mı?

Yanıtlar:


303

Geri oturum açmada böyle bir şey yapmak çok mümkün. Örnek bir yapılandırma:

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

Ardından, biri her şey için ve diğeri aşağıdaki gibi analitik verilerini kaydetmek için iki ayrı kaydedici kurarsınız:

Logger analytics = LoggerFactory.getLogger("analytics");

1
Bu tür bir şey yapmam gerekiyor, böylece aynı dosyaya satırsız besleme ekleyici ve normal ekleyici ekleyebiliyorum. Bu bilgi için teşekkürler.
djangofan

Farklı ek-başvuru belirtilirse, IMO additivity = false varsayılan olmalıdır. Çok sık olarak, bazı modüllerin bazı zamanlayıcı olayları nedeniyle çok sık günlük oluşturucu olacağı uygulamalar elde ederiz ve bu günlükleri farklı dosyalara ayırmak isteriz. Aynı günlüğü 10 farklı dosyaya kaydetmek gerçekten mantıklı değil. Bu nedenle, varsayılan olmayan bir tercih özelliği olmalıdır. Logback bir yeniden yazma olduğundan, aynı hatanın aynı yazar tarafından düzeltilmiş olması gerekirdi.
samarjit samanta

Sırasıyla farklı dosyalarda hata, hata ayıklama, bilgi mesajlarını günlüğe kaydetmek istiyorum. Logback.xml ile mümkün mü
Qasim

@Qasim - bu mümkün. Bakınız - amitstechblog.wordpress.com/2014/09/27/…
Andy Dufresne

Farklı paketlerden günlükleri bu yanıtın önerdiği gibi farklı dosyalara kaydetmeye çalışıyorum, ancak bu benim için çalışmıyor. Logback xml ekstrem burada - pastebin.com/Aii4f1Jk . Hazırda bekletme paketi TRACE düzeyi günlüklerini farklı bir dosyaya kaydetmeye çalışıyorum. Herhangi bir öneri?
Andy Dufresne

7

Dilediğiniz kadar kaydediciye sahip olabilirsiniz. Ancak, her paket için farklı şekilde oturum açmanız gereken bir tane olması daha iyidir. Daha sonra bu paketteki tüm sınıflar ve alt paketleri o belirli günlükçüyü alacaktır. Hepsi kök kaydediciyi paylaşabilir ve günlük verilerini additivity = "true" kullanarak kök günlükçü ekleyicisine gönderebilir. İşte bir örnek:

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

3

benim durumumda sınıf adlarını günlük adı olarak bırakmak istedim

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

ve bu tür birkaç dersim olduğu için 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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.