2011-06-16 15 views
196

Hem toplu ileti hem de istisnanın yığın izini günlüğe kaydetmek için doğru yaklaşım nedir?slf4j: biçimlendirilmiş iletinin günlüğe kaydedilmesi, nesne dizisi, istisna

logger.error(
    "\ncontext info one two three: {} {} {}\n", 
    new Object[] {"1", "2", "3"}, 
    new Exception("something went wrong")); 

Ben buna benzer bir çıktı elde etmek istiyorum: Birden fazla parametreye varlığında ve eğer

context info one two three: 1 2 3 
java.lang.Exception: something went wrong 
stacktrace 0 
stacktrace 1 
stacktrace ... 

slf4j versiyonu SLF4J 1.6.0 itibariyle 1.6.1

cevap

302

Bir günlüğe kaydetme deyimindeki son argüman bir istisnadır, daha sonra SLF4J, kullanıcının son bağımsız değişkeni bir istisna olarak değil, basit bir parametre olarak ele almasını istediğini varsayar. Ayrıca relevant FAQ entry'a da bakın.

Yani,

logger.error("one two three: {} {} {}", "a", "b", 
       "c", new Exception("something went wrong")); 

(daha sonra SLF4J sürümü 1.7.x ve) yazma veya yazma (SLF4J sürümünde 1.6.x)

logger.error("one two three: {} {} {}", new Object[] {"a", "b", 
       "c", new Exception("something went wrong")}); 

verecektir

one two three: a b c 
java.lang.Exception: something went wrong 
    at Example.main(Example.java:13) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at ... 

Kesin çıktı, altta yatan çerçevenin nasıl yapılandırıldığının yanı sıra temel çerçeveye (örneğin, günlüğe kaydetme, log4j, vb.) Bağlı olacaktır. Bununla birlikte, eğer son parametre bir istisna ise, altta yatan çerçeveden bağımsız olarak yorumlanacaktır. (genellikle logback.xml) projenizde logback ve kurulumu bir yapılandırma dosyası kullanıyorsanız @Ceki 'ın cevabı ek olarak

+0

1.6.1 ile denedim ve çıktı aşağıda gösterilmiştir. Yığın izlemenin eksik olduğunu unutmayın: ' 2011-06-16 17: 20: 57,570 DEBUG [main] SLF4JDemo.main (12): içerik bilgisi bir iki üç: 1 2 3 java.lang.Exception: bir şey yanlış gitti ' – rowe

+4

Hangi temel kayıt çerçevesi kullanıyorsunuz? Yukarıdaki cevabımda da belirtildiği gibi, eğer son parametre bir istisna ise, altta yatan çerçeveden bağımsız olarak yorumlanacaktır. (Logback ile test edildi, slf4j-log4j12, slf4j-jdk14 ve slf4j-simple.) – Ceki

+3

Maalesef, örneğinizde, format dizisindeki n = 3 yer tutucu ve nesne dizisinde n + 1 = 4 öğenin kullanıldığını fark etmedim . Biçim dizisinde n yer tutucularım ve ayrıca nesne dizisindeki n öğeleri ve üçüncü parametre olarak bir istisna vardı. Benim beklentim istisnanın stacktrace ile basılmış olmasıydı, ama bu asla olmadı. Bu tasarlandığı gibi çalışır mı? Ayrıca, eğer n yer tutucusuna ve n öğelerine sahipse, nesne dizisinde sonuncu eleman olmak istisnadır, ben herhangi bir stacktrace görmüyorum. Belki bir dizideki n + 1 nesneleri olan n yer tutucuları biraz daha fazla vurgulanmalıdır. – rowe

4

, siz de

<encoder> 
    <pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern> 
</encoder> 
kullanarak yığın izini çizmek için günlüğü tanımlayabilir

modeldeki% ex, farkı kılan şeydir

İlgili konular