L'enregistrement de Java - slf4j, log4j


Existe-t-il un moyen de transmettre slf4j logger une carte de propriétés?

Par exemple, je voudrais faire quelque chose comme ceci:

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

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

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

Ensuite, j'aimerais que mon appender reçoive log4j LoggingEvent avec les paramètres ci-dessus, comme ceci:

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'
}
...
...    

MISE À JOUR:

Existe-t-il un framework de journalisation java qui prend en charge le passage de données HashMap (ou similaire dans son interface)

Author: Edd, 2015-05-10

1 answers

De Manuel SLF4J "Contexte de diagnostic mappé" est essentiellement une carte maintenue par le cadre de journalisation où le code d'application fournit des paires clé-valeur qui peuvent ensuite être insérées par le cadre de journalisation dans les messages de journal. Les données MDC peuvent également être très utiles pour filtrer les messages ou déclencher certaines actions.

SLF4J prend en charge le MDC ou le contexte de diagnostic mappé. Si le framework de journalisation sous-jacent offre une fonctionnalité MDC, SLF4J déléguera à le MDC du cadre sous-jacent. Notez qu'à l'heure actuelle, seuls log4j et logback offrent la fonctionnalité MDC.

Comme vous avez étiqueté la question avec log4j et comme votre exemple cite les classes log4j, SLF4J vous permettra de définir des valeurs dans la carte MDC sur une base de thread en utilisant l'API slf4j. Ces valeurs seront alors nativement accessibles au niveau log4j dans le LoggingEvent.

Voici un exemple adapté du Logback manual cité dans le manuel SLF4J (et aussi par @Seelenvirtuose dans son commentaire) :

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");
  }
}

Ensuite, dans votre appender personnalisé, vous pouvez facilement obtenir les valeurs :

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

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

Bien sûr, la même fonctionnalité serait disponible via Logback ...

 2
Author: Serge Ballesta, 2015-05-10 09:54:52