Serilog: Autoriser la personnalisation de la sortie de texte « LogLevel »

Créé le 3 déc. 2020  ·  4Commentaires  ·  Source: serilog/serilog

Votre demande de fonctionnalité est liée à un problème ?
J'ai une exigence stricte selon laquelle les niveaux de journalisation émis par l'application doivent être l'un des suivants :

  • DEBUG
  • ERROR
  • INFO
  • WARN

Non seulement sémantiquement, mais le texte doit également correspondre précisément. C'est parce que j'écris sur un agrégateur de journaux qui est utilisé par plusieurs autres applications utilisant différents langages et frameworks, et ils ont standardisé leurs niveaux sur ces chaînes.

Nous voulons que nos journaux puissent être filtrés et analysés à l'aide d'outils et de requêtes existants, qui reposent sur ces valeurs.

Décrivez la solution que vous souhaitez
Exposez un mécanisme de manipulation du texte généré à partir de l'énumération LogEvent . Les valeurs doivent être entièrement personnalisables et modifiables.

Idéalement, on pourrait injecter une sorte de IFormatter<LogLevel> qui traduit les valeurs d'énumération en texte et qui est utilisé à l'intérieur pour toute la gestion de l'énumération (quel que soit le récepteur ou le formateur text/json utilisé).

Décrivez les alternatives que vous avez envisagées
Je peux créer un enrichisseur qui remplace la propriété "level" sur chaque événement en inspectant la propriété LogEvent.Level . Bien que cela fonctionne, cela semble moins qu'idéal et plus un hack, car cela n'"enrichit" pas vraiment la sortie du journal, il utilise le mécanisme pour effectuer quelque chose de complètement différent.

enhancement

Commentaire le plus utile

Ohhhh donc tu contournes complètement le formateur Json ?! C'est en effet _très_ intéressant Nick... Je pense en fait que ce sera très utile pour moi aussi pour d'autres raisons, maintenant que j'y pense. Cela combine vraiment le meilleur des deux mondes.

Mon erreur de ne pas avoir lu l'intégralité du fichier readme et d'avoir complètement raté les exemples Json !

Ce paquet d'expressions sera beaucoup plus amusant que je ne l'avais prévu.

Fermer ceci car il résout maintenant complètement le problème que j'ai proposé.

Tous les 4 commentaires

Salut Juliano !

_Serilog.Expressions_ implémente cela comme vous le souhaitez.

La façon la plus propre de le faire est d'implémenter à MapLevel() fonction définie par l'utilisateur :

https://github.com/serilog/serilog-expressions#implementing -user-defined-functions

et l'utilisation de MapLevel() dans votre modèle de sortie.

Quelque chose comme:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console(new ExpressionTemplate(
        "[{<strong i="15">@t</strong>:HH:mm:ss} {MapLevel(@l)} ({SourceContext})] {@m}\n{@x}"))
    .CreateLogger();

Ce serait cool d'entendre comment vous allez avec ça - jusqu'à présent, il n'y a pas beaucoup d'exemples pour _Serilog.Expressions_ (c'est tout nouveau) mais j'ai bon espoir que cela deviendra un élément essentiel de la boîte à outils Serilog, en particulier pour personnaliser JSON et la sortie de texte.

HTH !

Salut Nick

Serilog.Expressions implémente cela comme vous le préférez.

Wow! Première fois que j'entends parler de cette extension. Merci de me l'avoir signalé.

Cela semble assez fou! Vous êtes fous de proposer un tout nouveau DSL pour ça, bravo !

et l'utilisation de MapLevel() dans votre modèle de sortie.

Cela semble fonctionner extrêmement bien pour la journalisation basée sur du texte, mais le problème est que j'utilise actuellement un format json compact. D'après ce que j'ai compris en lisant rapidement ce que permet Expressions, il ne prend actuellement en charge que les flux utilisant ITextFormatter .

Il me semble qu'un crochet manque quelque part entre la conversion de C# LogEvent aux propriétés réelles en cours d'écriture. Idéalement, une solution fonctionnerait pour n'importe quel format de "sortie", qu'il s'agisse de texte ou de json.

Déjà une longueur d'avance, @julealgon ! :-) _Serilog.Expressions_ a été conçu pour prendre entièrement en charge JSON :

    .WriteTo.Console(new ExpressionTemplate(
        "{ {<strong i="6">@t</strong>, <strong i="7">@mt</strong>, <strong i="8">@l</strong>: MapLevel(@l), <strong i="9">@x</strong>, ..@p} }\n"))

https://github.com/serilog/serilog-expressions#formatting

Ohhhh donc tu contournes complètement le formateur Json ?! C'est en effet _très_ intéressant Nick... Je pense en fait que ce sera très utile pour moi aussi pour d'autres raisons, maintenant que j'y pense. Cela combine vraiment le meilleur des deux mondes.

Mon erreur de ne pas avoir lu l'intégralité du fichier readme et d'avoir complètement raté les exemples Json !

Ce paquet d'expressions sera beaucoup plus amusant que je ne l'avais prévu.

Fermer ceci car il résout maintenant complètement le problème que j'ai proposé.

Cette page vous a été utile?
0 / 5 - 0 notes