2017-02-17 7 views
1

Existe-t-il des bibliothèques de journalisation permettant la journalisation structurée des objets, ce qui signifie que la sortie est sous une forme structurée, telle que JSON ou XML?Comment puis-je faire une journalisation structurée?

Au niveau de l'application, je veux utiliser une syntaxe laconique (l'enregistrement a tendance à cacher le code d'application), tels que

  1. logger.info("Deleting user", user)
  2. logger.info(part("Deleting user", user), part("Account", account), part("Something else", someValue));

Au niveau du fichier journal, Je reçois des JSON (etc) bien structurés, avec des méta-données (thread, MDC, temps, niveau, etc) comme une enveloppe, avec mon propre message comme un objet JSON structuré à l'intérieur, par exemple

"log" : { 
    "time": <timestamp>, 
    "level": "INFO", 
    "thread": <thread-name>, 
    "MDC": [MDC info added by application code], 
    etc... 
    "message": { 
    "Message": "Deleting User", 
    "User": <JSON object of the user serialised> 
    } 
} 

Bien sûr, il ne devrait pas être joliment imprimé dans le fichier journal.

Il serait cool que les objets de domaine (par exemple l'utilisateur) puissent implémenter une interface Loggable qui a des méthodes pour sérialiser l'état pour différents niveaux de consignation, par ex.

  1. niveau INFO donne un résumé
  2. niveau DEBUG donne plus, des données plus profondes, récursive

* Certains aggrégateur de journal pourrait alors donner un sens des journaux à un niveau sémantique . Les journaux sont formatés de manière cohérente permettant la recherche, etc. *

J'ai déjà mis en place quelques fonctions qui me permettent de faire en sorte que les paires clé/valeur soient formatées mais cela ne me donne pas Tout ce que je veux. Cela fonctionne, en normalisant les valeurs clés /, le formatage des valeurs, mettant en évidence les valeurs NULL, etc, mais il ne dégage pas de JSON et ne peut pas déléguer la mise en forme de l'objet: -

logger.info(logString(part("Deleting user", user), part("Account", account), part("Something else", someValue))); 

Toutes les idées?

+0

Essayez https://github.com/michaeltandy/log4j-json –

+0

@DavidKerr vous voulez json Chaîne structurée comme au-dessus de votre maison? –

+0

@MayankPandya c'est un début, mais il ne met que les méta-données en JSON, il ne structure pas mes objets en JSON (la partie "message" de mon exemple JSON). –

Répondre

0

Vous pouvez utiliser la méthode JSONObject.toString() pour imprimer correctement le JSON sur logcat.

Log.d("tag", jsonObject.toString(4)); 
+0

Mais mon objet n'est qu'un simple objet de domaine POJO. Par défaut, le code de journalisation appelait simplement 'toString' mais si l'objet de domaine implémente (par exemple) 'Loggable', alors les méthodes sur ce dernier peuvent transformer l'objet de domaine en JSON. –

0

Ceci est l'espace de problème adressé par message templates. La mise en œuvre serilogj en Java ressemble à:

Log.information("Deleting {@user}", user); 

@ indique que la propriété user doit être sérialisée dans l'événement sous forme de données structurées.

Même sans sérialisation, les modèles de message produisent des journaux avec des propriétés sémantiques de première classe. Par exemple l'événement:

Log.information("Dividing {a} by {b}", 1, 0); 

produira un événement avec un message 1 par 0 En divisant et les propriétés a = 1 et b = 0.