8
votes

Comment utiliser une cible RichTextBox comme une cible Nlog dans une application WPF?

J'ai lu les messages suivants, mais ils ne sont pas aidés à obtenir une même manière efficace d'imprimer des journaux de Nlog sur une cible de contrôle Richtextbox comme dans Winforms.

Comment puis-je utiliser la cible Richtextbox de Nlog dans l'application WPF?

wpf: reliure Richtextbox à la sortie de l'enregistreur

J'ai également parcouru le forum officiel mais sans succès (à l'exception des suggestions de lire les deux postes ci-dessus).

L'idée serait d'ajouter la cible comme suit: xxx

et dans le WPF Fenêtre avec nom MyWPFWindInTown Nom, pour ajouter un contrôle RichTextBox avec RTBConsole. Même si je crée la cible de manière programmatique après la charge de Winow, elle n'utilisera pas le RTBConsole existant mais crée un nouveau formulaire.

Donc, votre aide est appréciée!


5 commentaires

Qu'avez-vous essayé jusqu'à présent et que se passe-t-il? S'il vous plaît montrer du code au lieu de simplement dire ne fonctionne pas.


Quels problèmes spécifiques rencontrez-vous avec la journalisation à RichTextBox? "Ce n'est pas aussi efficace" est assez vague. Qu'est-ce que vous attendez-vous?


S'il vous plaît voir mon édition ci-dessus. Le problème est assez simple de reproduire si vous utilisez Nlog et WPF.


enregistre le texte sur Windows.Forms.Control.Text Property Control of Nom spécifié.


Pour les interrogations sur la question de savoir si la question est valide ou non, Nlog Richtextbox Sortie à Winforms Richtextbox uniquement et cette question posait comment pouvez-vous produire Nlog OT WPF Richtextbox. J'ai voulu faire la même chose sans succès.


4 Réponses :


0
votes

Je conviens que les 2 liens référencés dans la question ne sont pas optimaux. (Je n'utiliserais pas non plus ces solutions.)

Voici ce que j'essayais:

Ecrire une cible de contrôle personnalisée (WPF) Utilisation d'un algorithme similaire à celui de Nlog's FormControlTarget .

Assurez-vous d'enregistrer votre nouvelle cible .
De plus, Nlog's Formhelper peut être utile. < / p>

La plupart du code WinForms devraient être facilement convertibles en WPF.


0 commentaires

9
votes

J'ai créé une cible Nlog personnalisée et je l'ai associée à une zone de texte.

public class NlogMemoryTarget : Target
{
    public Action<string> Log = delegate { };

    public NlogMemoryTarget (string name, LogLevel level)
    {
        LogManager.Configuration.AddTarget (name, this);

        LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", level, this));//This will ensure that exsiting rules are not overwritten
        LogManager.Configuration.Reload(); //This is important statement to reload all applied settings

        //SimpleConfigurator.ConfigureForTargetLogging (this, level); //use this if you are intending to use only NlogMemoryTarget  rule
    }

    protected override void Write (AsyncLogEventInfo[] logEvents)
    {
        foreach (var logEvent in logEvents) {
            Write (logEvent);
        }
    }

    protected override void Write (AsyncLogEventInfo logEvent)
    {
        Write (logEvent.LogEvent);
    }

    protected override void Write (LogEventInfo logEvent)
    {
        Log (logEvent.FormattedMessage);
    }
}


public partial class MainWindow
{
    private NlogMemoryTarget _Target;

    public MainWindow ()
    {
        InitializeComponent ();

        this.Loaded += (s, e) => {
            _Target = new NlogMemoryTarget ("text box output", LogLevel.Trace);
            _Target.Log += log => LogText (log);
        };
    }

    private void LogText (string message)
    {
        this.Dispatcher.Invoke ((Action) delegate () {
            this.MessageView.AppendText (message + "\n");
            this.MessageView.ScrollToEnd ();
        });
    }
}


14 commentaires

Comment ajoutez-vous un journal?


@publicenemy fixé. Le journal est envoyé par délégué, dans une zone de texte dans ce cas.


Je suis désolé d'être noob. Pourriez-vous ajouter un seul exemple de ligne de comment ajouter des journaux? est-ce logtext ("mon journal");?


@publicenemy non, cela contournerait l'ensemble du nlog. Au lieu de cela, effectuez la journalisation comme d'habitude dans Nlog: Statique privée _L = logManager.getCurrentClassLogger (); [...] _l.info ("Hello World"); . Vous devez configurer _L pour vous connecter à la MemoryTarget créé dans le code de réponse, voir ici: Stackoverflow.com/q/3516242/39590


Maintenant que je le regarde, cela ressemble à beaucoup de travail pour un travail simple. Je suppose que c'est que la cible n'existe pas dans l'ensemble par défaut fourni par Nlog; (


Exactement ce que je cherchais. Merci.


Avez-vous eu mon édition ou que vous n'aimez pas mon édition? Merci. Je demandais juste.


@Publicenemy C'était un très vaste changement, je pense que cela avait eu du texte de débogage qui n'était pas nécessaire? J'essaie de le trouver mais je ne le vois pas dans mon histoire.


@MAFU SimpleConfigurator.configurefforTorgetLogging (ceci, niveau); écrase toutes les configurations de journalisation. Si vous avez déjà une journalisation déjà configurée, vous devez utiliser logmanager.configuration.reload (); à la place. N'oubliez pas non plus logmanager.configuration.loggingrules.add (Nouveau journalGrule ("*", niveau, ceci)); Pour travailler avec les règles existantes.


Modification de la réponse de Mafu pour avoir un ordre correct des déclarations au cas où vous auriez besoin de travailler avec des règles existantes. Public MemoryTargetex (Nom de la chaîne, niveau LogLevel) {logmanager.configuration.addtarget (nom, ceci); LogManager.configuration.loggingrules.add (nouveau journalisation ("" * ", niveau, ceci)); Logmanager.configuration.reload (); }


@RiskyPathak N'hésitez pas à éditer cela dans la réponse (je pense que vous obtenez +2 représentant de cela aussi)


Souhaitez-vous améliorer votre code afin que nous puissions voir des messages colorés au moins basés sur des types de journaux tels que Trace, débogage, Info et etc. Merci!


@MAFU J'ai ajouté une réponse séparée pour réfléchir à des changements et considérations importants, en particulier dans la portée du logmanager.Configuration. Votre extrait de code de sa forme actuelle n'a pas été utilisable pour moi. J'allais à l'origine modifier votre réponse pour être la réponse que j'ai fournie, mais c'était quelques changements. Si vous mettez à jour votre réponse pour ressembler à la mienne, faites-moi savoir - je vais supprimer ma réponse.


logmanager.configuration.reload () n'aide pas, voir @Bretcaswell 's Réponse .



6
votes

Bien que cela ne réponde pas vraiment à votre question, mais je crois que cette solution est meilleure. Un contrôle WPF utilisé pour afficher les journaux NLog dans ListView. https://github.com/erizet/nlogViewer .


0 commentaires

3
votes

La réponse de @ Mafu suggère:

[créer] un nlog [mémoire] cible et [link] it to a textbox . .

Cet échantillon "liera-le" via "code> événement et des délégués du gestionnaire d'événements.

Définissez une cible de mémoire Nlog sous forme de type type xxx

utilisation dans la commande de fenêtre WPF xxx

Lorsque vous appelez sur dosomething (ou logger.trace ), vos méthodes surchargées dans votre cible de mémoire exécuteront - ce qui augmente l'événement Onlog . Depuis que vous avez attribué un gestionnaire d'événements, logtext , sur Onlog dans la construction de MainWindow , il s'exécutera.


0 commentaires