Как я могу использовать RichTextBox в качестве цели NLog в приложении WPF? - PullRequest
6 голосов
/ 08 июля 2011

Я прочитал следующие посты, но ни один из них не помог просто получить такой же эффективный способ печати журналов из NLog на целевой элемент управления RichTextBox, как в Winforms.

Как я могу использовать RichTextBox Target от NLog в приложении WPF?

WPF: привязка RichTextBox к выходу регистратора

Я также просматривал официальный форум, но безуспешно (кроме предложений прочитать два вышеупомянутых поста).

Идея состоит в том, чтобы добавить цель как:

<target xsi:type="RichTextBox" name="console"
     layout="${longdate:useUTC=true}|${level:uppercase=true}|${logger}::${message}"
     autoScroll="true"
     maxLines="1000000"
     controlName="rtbConsole"
     formName="MyWPFWindowName"
     useDefaultRowColoringRules="true">
</target>

И в окне WPF с MyWPFWindowName в качестве имени, чтобы добавить элемент управления RichTextBox с помощью rtbConsole. Даже если я создаю цель программно после загрузки winow, она не будет использовать существующую rtbConsole, а создаст новую форму.

Итак, ваша помощь приветствуется!

Ответы [ 3 ]

8 голосов
/ 02 июля 2012

Я создал собственную цель NLog и связал ее с текстовым полем.

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 ();
        });
    }
}
4 голосов
/ 17 марта 2013

Хотя это не совсем ответ на ваш вопрос, но я считаю, что это решение лучше. Элемент управления wpf, используемый для отображения журналов NLog в списке. https://github.com/erizet/NlogViewer.

0 голосов
/ 23 декабря 2011

Я согласен, что 2 ссылки в вопросе не являются оптимальными.(Я также НЕ использовал бы эти решения.)

Вот что я бы попробовал:

Написать пользовательский (WPF) целевой элемент управления , используя алгоритм, аналогичный NLog's FormControlTarget .

Обязательно зарегистрируйте новую цель .
Также может помочь NLog FormHelper .

Большая часть кода WinForms должен быть легко конвертируемым в WPF.

...