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

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

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

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

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

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



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

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

7
задан Community 23 May 2017 в 10:30
поделиться

1 ответ

Поскольку ответ @mafu предлагает:

[Создают] пользовательское NLog [память] Target и [ссылка] это к TextBox.

Этот образец 'свяжет его' через event и Делегаты обработчиков событий.

Определяют Цель Памяти NLog как Type

public class NlogMemoryTarget : Target
{
    public event EventHandler<string> OnLog;

    public NlogMemoryTarget(string name, LogLevel level) : this(name, level, level) {}
    public NlogMemoryTarget(string name, LogLevel minLevel, LogLevel maxLevel)
    {
        // important: we want LogManager.Configuration property assign behaviors \ magic to occur
        //   see: https://stackoverflow.com/a/3603571/1366179
        var config = LogManager.Configuration;

        // Add Target and Rule to their respective collections
        config.AddTarget(name, this);
        config.LoggingRules.Add(new LoggingRule("*", minLevel, maxLevel, this));

        LogManager.Configuration = config;
    }

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

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

    protected override void Write(LogEventInfo logEvent)
    {
        OnLog(this, logEvent.FormattedMessage);
    }

    // consider overriding WriteAsyncThreadSafe methods as well.
}

Использование в Управлении Окном WPF

public partial class MainWindow
{
    private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

    private NlogMemoryTarget _nlogMemoryTarget;

    public MainWindow()
    {
        InitializeComponent();

        _nlogMemoryTarget = new NlogMemoryTarget("TextBoxOutput", LogLevel.Trace);
        _nlogMemoryTarget.OnLog += LogText;
    }

    private void LogText(object sender, string message)
    {
        this.MessageView.AppendText($"{message}\n");
        this.MessageView.ScrollToEnd();
    }

    private void DoSomething() {
       logger.Trace("DoSomething called!");
    }
}

, Когда Вы обратитесь DoSomething (или делаете logger.Trace), Ваши перегруженные методы в Вашей цели памяти выполнятся - который повышает событие OnLog. Так как Вы присвоили обработчик событий, LogText, к [1 111] в конструкции [1 112], она выполнится.

1
ответ дан 6 December 2019 в 15:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: