Geri oturumlamanın her günlüğün başında kendi durumunu vermesini nasıl önleyebilirim?


145

Bu bir dikkatsizlik hatası gibi görünüyor, ama sebebini bulamıyorum. Logback / slf4j ile günlük kaydı (en son sürüm slf4j-api-1.6.1, logback core / classic 0.9.24). Test için en basit günlük yapılandırması:

<configuration>
 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <layout class="ch.qos.logback.classic.PatternLayout">
   <!-- DONT USE THIS FORMATTER FOR LIVE LOGGING THE %L LINE NUMBER OUTPUTTER IS SLOW -->
   <pattern>%le %-1r [%c{1}:%L] %m%n</pattern>
  </layout>
 </appender>
 <root level="DEBUG">
  <appender-ref ref="stdout" />
 </root>
</configuration>

Her günlük kurulumu, logback'in dahili durum satırlarıyla başlar:

11:21:27,825 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:21:27,826 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:.../logback-test.xml]
11:21:28,116 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:21:28,124 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
11:21:28,129 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout]
11:21:28,180 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [layout] on top of the object stack.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:21:28,207 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
11:21:28,207 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[ROOT]

Bu, dokümanlara göre, geri oturum açma biçiminin varsayılan olarak kullandığı biçimdir. Daha sonra yapılandırmayı okumayı bitirir (bu, farklı bir format çıkarmak için ayarlanır) ve düzgün formatlanmış çıktıyla devam eder. Bunu <configuration debug="false">etkilemeyen bir config parametresi var.

Bunu nasıl kapatacağını bilen var mı?


Son oturum açma sürümleri% L hesaplanırken çok daha hızlıdır.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen, "L / line: Satır numarası bilgilerinin oluşturulması özellikle hızlı değildir. Bu nedenle, yürütme hızı bir sorun olmadığı sürece kullanımından kaçınılmalıdır." FWIW: logback.qos.ch/manual/layouts.html (bu yüzden belki daha hızlı ama yine de süper hızlı değil ya da başka bir şey ...)
rogerdpack

@rogerdpack evet. Bir istisnanın yığın izini analiz ederek bulunur. Bu daha hızlı hale geldi.
Thorbjørn Ravn Andersen

Yanıtlar:


249

Öğenin debugniteliğini olarak ayarlarsanız, tüm durum bilgilerini konsola alırsınız. Sorununuz buysa, yanlış olarak ayarlayın veya kaldırın.configurationtrue

Düzeyde yapılandırma sorunlarınız varsa WARN veya daha yüksek varsa, tüm durum bilgilerinin de konsola kaydedilmesini sağlarsınız (seviye mesajları dahil INFO). Bu sorunun en iyi çözümü sorunu düzeltmektir (sizin durumunuzda <layout>elemanı bir <encoder>elemanla değiştirin ).

Herhangi bir nedenle sorunu çözemezseniz, ancak durum bilgilerini konsoldan kaldırmak istiyorsanız, bunun yerine bir alternatif yapılandırabilirsiniz StatusListener. NopStatusListenerDurum bilgilerini tamamen kaldırmak için şunu kullanın :

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>

9
Bu doğru cevap, daha fazla oy verilmeli, teşekkürler. (logback 1.0.11)
Jakub Kulhan

3
Bu işe yaradı. INFOGünlük iletilerinin de yok olacağı konusunda net değildim , ama aslında öyle. Cevabın bunu söylediğini biliyorum, ama bazı nedenlerden dolayı benim için net değildi. Açık olmak için: kodlayıcı / düzen sorununu düzeltin ve sadece uyarı mesajları kaybolmayacak, aynı zamanda bilgi mesajları da sorunla ilgili olmasalar bile kaybolacaktır.
Jason

3
Hata ayıklama özniteliğiyle çalışmadı, ancak durum dinleyicisiyle kusursuz çalıştı.
Ameba Spugnosa

Teşekkür - gerekli durum dinleyicisi.
Hezekiel Victor

2
Bu yaklaşımı kullanmaya dikkat edin, işe yarıyor gibi görünüyor, ancak dosyanızda bir yapılandırma hatası olduğu gerçeğini gizliyor. Asıl sorun WARN günlükleri, bu sorunlar config, sonra tüm günlükleri inc. BİLGİ git.
teknopaul

45

Dokümanlarda açıklandığı gibi , yapılandırma dosyasının ayrıştırılması sırasında uyarılar veya hatalar oluşursa, geri oturum açma durum verilerini konsolda otomatik olarak yazdırır.

Takip http://logback.qos.ch/codes.html#layoutInsteadOfEncoder yani onun uyarı mesajında logback bahsettiği linki. Burada belirtilen adımları izledikten sonra, <layout> öğesini <encoder> ile değiştirirseniz, geri oturum açma konsoldaki mesajların yazdırılmasını durduracaktır.


4
Beni doğru yönde göstermiş olmanıza rağmen, bir çeşit haklı. Her ne kadar bir uyarıya neden olan logback.xml dosyasında başka bir satır kaldırmanın hile yaptığını ortaya çıkarsa da, bu kodlayıcı sözdizimine etkisi olmadan değişmiştim. Bu konuda aldatıcı olan şey, çıktının günlük kayıt dosyanızı ayrıştırmadan önce alınan kararları çıkarıyor gibi görünmesidir, (1> Kaynak bulunamadı [logback.groovy], 2> Bulunan kaynak [logback-test.xml]). Durum mesajlarını ayrıştırılmadan önce ne olacağını gizlemek için geri arama testinde bir düzeltme yapmak oldukça kafa karıştırıcı. Ama işaretçi için teşekkürler.
Steve

5
Steve B.'nin kastettiği şey, Logback'in yapılandırmada daha sonra yapılandırmada bir hatayla karşılaşmadığı sürece (ve özellikle) yapılandırma dosyasının yüklenmesinden önce olanlar da dahil olmak üzere tüm durum mesajlarını bastırması mantıksız (veya en azından geleneksel olmayan) olmasıdır . Bu kurala aşina değilseniz ve önce bu durum mesajlarını gördüğünüzde (bir yapılandırma uyarısı veya hatası anlamına gelir), çoğu kullanıcı hata çözüldükten sonra Logback'in artık ilgili hata mesajlarını yazdırmayacağını, ancak diğerini yazdırmaya devam edeceğini bekler. durum mesajları.
Derek Mahar

6
FWIW, bu oldukça kafa karıştırıcı davranışı da buluyorum. BİLGİ düzeyindeki mesajların kusuru, gerçekten düzeltmem gereken şeyleri söyleyen ERROR mesajlarını gizlemek için oldukça iyi bir iş çıkarıyor. Bir DTD eksikliği veya yapılandırma dosyasının sözdiziminin başka bir belirtimi, iletiyi gördükten sonra bile hata ayıklamak için oldukça deneme yapmıştır.
Tom Anderson

4
@Ceki: Sonunda anladım: Bu mesajları tetiklemenin 2. yolu debug="true", configurationöğesinde niteliğe sahip olmaktır logback.xml. Bu deliğe giren diğer kişilerin yararına lütfen bunu belirtin!
Carl Smotricz

6
Belki de ilk INFO ifadesinden önce, 'Geçmiş durum bilgilerinin tümünü veren bir Uyarı algılandı. Bu mesajı durdurmak için uyarılarınızı / hatalarınızı düzeltin '
David Roussel

7

Ceki cevabı doğru:

(...) yapılandırma dosyasının ayrıştırılması sırasında uyarılar veya hatalar oluşursa, geri oturum açma durum verilerini konsolda otomatik olarak yazdırır.

Doğru yaptıktan sonra, günlüğünüzün ilk satırlarında artık herhangi bir kirlilik olmayacak.

Mart 2015 itibariyle, Logback 1.1.2'de , <encoder>alt bileşeni kullanmanız gerekiyor - <layout>artık kullanımdan kaldırıldı ve kullanılıyorsa hata mesajları görünecektir. Bunu kontrol edemezsiniz, bu Logback varsayılan davranışıdır.

Bazı iç sınıflar da yeniden adlandırıldı ve manuel sayfalarındaki örnekler bile eski!

Kaydediciyi yapılandırmanın doğru yoluna sahip olan Hata Kodu Yardım sayfasındaki kod snippet'i aşağıdadır. Bu, projemdeki sorunu tamamen düzeltti. http://logback.qos.ch/codes.html#layoutInsteadOfEncoder

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
  ...
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%msg%n</pattern>
  </encoder>
</appender>

4

Steve'in düzeltmeyi bulduğunu fark ettim ama iş parçacığından bahsetmedi. Başka bir kişinin aynı sorunu vurması durumunda, düzeltmedir.

Değiştir "<düzen>" ile elementler "<kodlayıcı> .. </ kodlayıcı>"

Suçlu: <layout class = "ch.qos.logback.classic.PatternLayout">


1
Bu iletileri tamamen kaldırmak istiyorsanız, Rasmus'un açıklandığı gibi NopStatusListener'ı kullanın. Kodlayıcı ve düzen yaklaşımı, örneğin 'logback.groovy bulunamadı' gibi mesajları bastırmaz. Logback-classic 1.1.3 kullanıyorum (Mart 2015)
Cristian Botiza

3

Kendimi aynı sorunla mücadele yani benim kod ile ilgili olmayan, başlangıçta sağ oturum satırları bir grup vardı. İşte böyle düzelttim.

<configuration debug="false">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 
        %logger{36} - %msg%n</pattern> </encoder> -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{10} - %msg%n</pattern>
    </encoder>
</appender>

<root level="error">
    <appender-ref ref="STDOUT" />
</root>

<logger name="fun.n.games" level="DEBUG" />

Bu, pom.xml dosyasına aşağıdaki girişle çalışır

        <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

2

Bu, 0.9.29'da düzeltildi gibi görünüyor. Birkaç test yaptım. Artık Joran INFO yok. Sanırım bu sabitleme taahhüdü.


2

Aynı sorunu yaşadım bu satırı ekledim

        <!-- Stop output INFO at start -->
        <statusListener class="ch.qos.logback.core.status.NopStatusListener" />

ve başarıyla çalıştı


Bu çalışır, ancak ERROR ileti çıkışını da engeller - ciddi geri dönüş yapılandırma sorunu ortaya çıktığında çıkış üretilmez.
Mart'ta Honza

0

Her şeyi denedim ve hiçbir şey benim için işe yaramadı. Benim sorunum, sınıf yolumdaki birden çok logback.xml dosyası nedeniyle oldu. Çok modüler projelerde bu durum yaygındır. Sınıf yolunda yalnızca bir logback.xml dosyası olduğunda, belirsizlik yoktur ve sorun çözülmüştür.


size hangi çıktıyı verdi?
rogerdpack

0

Kullanarak logback.groovy:statusListener(NopStatusListener) (içinde src/test/resources/logback.groovy) çalışır.

(Geçerli bir kullanım örneği, örneğin Eclipse'de ANT ile çalışılıyorsa, ünite testlerinin yapıldığı logback günlüğü, groovy sınıfları ve birim testleri kullanılıyorsa src/test/resources/logback.groovy, ancak src/main/resources/logback.groovyhariç tutamayacağınız (veya benzerlerini) görecekse ( ANT'nin sınıf yolunun kullanıldığı söylenirse ) projeler sınıf yolu).)


0

Kendi oturum açma günlüklerini kapatmak için durum dinleyicisini kullanmayı tercih ederim:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  ...
</configuration>

Ancak belirtildiği gibi NopStatusListener ayrıca uyarı ve hataların gösterilmesini önler. Böylece özel durum dinleyicinizi yazabilir ve günlük düzeyini manuel olarak değiştirebilirsiniz:

package com.your.package;

import ch.qos.logback.core.status.OnConsoleStatusListener;
import ch.qos.logback.core.status.Status;

import java.util.List;

public class PrintOnlyWarningLogbackStatusListener extends OnConsoleStatusListener {

    private static final int LOG_LEVEL = Status.WARN;

    @Override
    public void addStatusEvent(Status status) {
        if (status.getLevel() == LOG_LEVEL) {
            super.addStatusEvent(status);
        }
    }

    @Override
    public void start() {
        final List<Status> statuses = context.getStatusManager().getCopyOfStatusList();
        for (Status status : statuses) {
            if (status.getLevel() == LOG_LEVEL) {
                super.start();
            }
        }
    }

}    

Ardından logback.xml dosyanızda kullanın:

<configuration>
  <statusListener class="com.your.package.PrintOnlyWarningLogbackStatusListener" />
  ...
</configuration>
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.