53
votes

Le modèle de message doit être constant de temps de compilation

J'ai ce code xxx

et j'obtiens un avertissement ici $ "Recherche de note moyenne de la vidéo: {vidéoguid}"

< Blockquote>

Le modèle de message doit être constant une constante de temps

J'utilise rider , il n'y a aucune suggestion pour réparer cet avertissement.

Je ne comprends pas pourquoi cela me donne un avertissement, comment pourrait Je corrige ceci?


7 commentaires

Non, je ne le pense pas, mon problème lié à c #


Essayez d'extraire ce $ "Recherche de note moyenne de la vidéo: {Videoguid}" à une variable, comme var msg = $ "Recherche de note moyenne de la vidéo: {videoguid}"; et utilisez ce message comme argument de connexion


@godot a essayé cela mais l'avertissement existe toujours


C'est une caractéristique du Serilog, voir Discussion ici .


Essayez _Logger.LogInformation ("Finding Moyenne Rating of Video: {Videoguid}", Videoguid) ou _logger.logInformation ("Finding Moyenne Rating of Video:" + vidéoguid) . Je dirais que la raison est de la journalisation structurée qui utilise les mêmes supports bouclés pour les modèles et l'analyseur manquant la partie de chaîne interpolée.


Si vous utilisez Serilog - consultez ce post


Rapport à JetBrains en tant que bug youtrack.jetbrains.com/issues/rider Et vous pourriez obtenir un répondre là-bas.


2 Réponses :


101
votes

La façon de se débarrasser de l'avertissement est de fournir la variable Videoguid séparément, comme ceci:

_logger.LogInformation("Finding average rating of video : {VideoGuid}", videoGuid);


12 commentaires

Ceci est une caractéristique du Serilog, non? L'utilisez-vous ou ont-ils introduit la journalisation structurée dans .NET 5? Il pourrait être bon de clarifier en tout cas.


Yamaç Kurtuluş, j'utilise nlog , du moins pour le moment. Je suppose que l'équipe IntelliJ conserve une liste de cadres soutenant une journalisation structurée quelque part pour savoir quand activer cet avertissement (ou peut-être qu'ils ont un algorithme plus sophistiqué - il doit y avoir un Lot d'effort et de code derrière Beaucoup d'avertissements que leurs outils génèrent).


Pour moi, la solution (que les créateurs de Rider / MS / C # proposent?) N'a pas de sens, il peut induire le code induit en erreur puisque les arguments nommés sont juste des arguments commandés - aucune correspondance de nom, donc le code logger.logdebug ("hey { Foo}, hi {bar} ", bar, foo); loga hey bar, hi foo , encore plus de variables de renommée bar et foo fera du code étrange ... ("hey {foo}, hi {bar}", big, bang); - Rider / Resharper ne prend pas en charge la renommée dans {} également atm .


@svonidze L'utilisation de {} dans la chaîne peut simplement être considérée comme la même que ce que vous utiliseriez pour string.format () . Vous pouvez ajouter des variables nommées pour le rendre plus facile à lire, mais vous pouvez tout aussi bien faire logger.logdebug ("hey {0}, hi {1}", bar, foo) - serons les mêmes. Gardez cela à l'esprit, cela pourrait vous aider.


@NewteqDeveloper Il est clair, c'est ce que je voulais dire sous "Les arguments nommés sont juste des arguments ordonnés - pas de correspondance de nom", il ne remplace pas la beauté et la clarté de l'interpolation des cordes


Oh oui, je comprends. Je suis d'accord avec vous - il ne remplace pas la clarté que l'interpolation de chaîne fait, cependant, comme le répondant mentionné, il aide une tonne avec la journalisation structurée. Si vous n'allez jamais écrire des journaux au format de chaîne dans un fichier texte, je dirais que vous pouvez complètement ignorer cet avertissement. Après tout, c'est juste un avertissement. Mais, pour permettre la journalisation structurée, cela aidera à réparer l'avertissement comme mentionné.


@svonidze C'est absolument critique, si vous êtes un développeur de bibliothèque, que vous n'ignorez pas cet avertissement, car vous inonderas les systèmes de journalisation en aval avec des messages qui ne peuvent pas être correctement élidés ou compressés. La question de savoir si elle est "plus propre" n'est pas pertinente dans ce cas, car les modèles non constants sont erronés lors de l'utilisation d'un cadre de journalisation structuré.


Cela fonctionne-t-il avec quelque chose comme logger.logInformation ("L'état du serveur est {server.state}.", Server.state); ? J'espère que c'est le cas, parce que j'ai changé beaucoup de lignes comme celle-ci;) Le compilateur ne se plaint pas, je me demande si les chaînes seront interpolées correctement dans le journal.


@Ekw "éludé" ??


@tharenediad Merriam-webster.com/dictionary/elide


@Harry J'essaierais d'éviter la ponctuation des variables (et des messages, vraiment). Aucune garantie que l'objectif du journal prendra en charge cela. Si vous utilisez SEQ, je ne sais pas si ce n'est pas étayé, mais vous finiriez probablement par vous retrouver avec une requête comme SELECT * dans le flux où server.state = 'foo' et 'server.state' = 'bar'


J'avais un journal comme celui-ci _logger.logInformation ($ "Traitement des notifications pour le client {client.ChompanyName} et user {user.userid}"); mais tout en débogue Notifications pour le client {client.companyName} et user {user.userid} . Cela ne se souciait pas de remplacer les valeurs correctes.



-1
votes

Il s'agit d'un faux positif dans l'extension Serilog pour Rider, mais une autre manière de supprimer cet avertissement est de désactiver l'avertissement une fois (ou dans le monde dans votre fichier de classe).

// ReSharper disable once TemplateIsNotCompileTimeConstantProblem
_logger.LogInformation(messageTemplate);

Pas le meilleur Solution mais c'est aussi une option.

Maintenant, vérifiez Réponse de ROF sur la raison pour laquelle l'avertissement. p>


0 commentaires