2015-05-10 3 views
3

Есть ли способ передать slf4j logger карту свойств?Java Logging - slf4j, log4j

, например, я хотел бы сделать что-то вроде этого:

Logger logger = LoggerFactory.getLogger(SomeClass.class); 

Map data = new HashMap<String, String>(); 
data["key1"] = "value1"; 
data["key2"] = "value2"; 

logger.info("my info message", data) 

Тогда, я хотел бы, что мой Appender получит log4j LoggingEvent с указанными выше параметрами, например:

public class MyAppender extends AppenderSkeleton { 
... 
... 

@Override 
protected void append(LoggingEvent event) { 
    Map properties = event.getProperties(); 
    String valueOfKey1 = (String) properties.get("key1"); 
    //valueOfKey1 sould be equal to 'value1' 
} 
... 
...  

UPDATE:

Есть ли какая-либо инфраструктура регистрации java, которая поддерживает передачу данных HashMap (или sim илар в его интерфейсе)

+0

вы пропустили «новый» до «HashMap» – Suspended

+2

вы ищете [МЦС] (http://logback.qos.ch/manual/mdc.html)? – Seelenvirtuose

+0

Может быть .. Я не знаком с этим .. вы можете уточнить? –

ответ

2

От SLF4J Manual«Отображенный диагностический контекст» - это, по существу, карта, поддерживаемая каркасом ведения журнала, где код приложения предоставляет пары ключ-значение, которые затем могут быть вставлены в структуру журнала в сообщениях журнала. Данные MDC также могут быть очень полезны при фильтрации сообщений или при запуске определенных действий.

SLF4J поддерживает MDC или сопоставленный диагностический контекст. Если базовая структура ведения журнала предлагает функциональность MDC, SLF4J будет делегировать MDC базовой структуры. Обратите внимание, что в настоящее время только log4j и logback предлагают функциональность MDC.

Как помечено вопрос с log4j и в качестве примера приводит log4j классов, SLF4J позволит установить значение в карту MDC на нитке базах с использованием SLF4J API. Затем эти значения будут доступны на уровне log4j в LoggingEvent.

Вот пример адаптирован из Logback manual цитируется в SLF4J руководстве (а также @Seelenvirtuose в своем комментарии):

public class SimpleMDC { 
    static public void main(String[] args) throws Exception { 

    // You can put values in the MDC at any time. Before anything else 
    // we put the first name 
    MDC.put("key1", "value1"); 

    [ SNIP ] 

    Logger logger = LoggerFactory.getLogger(SimpleMDC.class); 
    // We now put the last name 
    MDC.put("key2", "value2"); 

    logger.info("Info log message"); 
    } 
} 

Затем в пользовательском Appender, вы можете easyly получить значение:

public class MyAppender extends AppenderSkeleton { 
... 
... 

@Override 
protected void append(LoggingEvent event) { 
    String valueOfKey1 = (String) event.getMDC("key1"); 
    //valueOfKey1 should be equal to 'value1' 
} 
... 
... 

конечно, то же functionnality будет доступен через Logback ...