Я прочитал следующие сообщения, но ни один из них не помог получить такой же эффективный способ печати журналов из NLog на контрольную цель RichTextBox, как в Winforms.
Как я могу использовать RichTextBox NLog Цель в приложении WPF?
WPF: Привязка RichTextBox к выходу регистратора
Я также просмотрел официальный форум, но безуспешно (кроме предложений прочитать два вышеупомянутых сообщения).
Идея заключалась бы в том, чтобы добавить цель как:
И в окне WPF с MyWPFWindowName в качестве имени добавить элемент управления RichTextBox с помощью rtbConsole. Даже если я создам целевой объект программно после загрузки окна, он не будет использовать существующую rtbConsole, а создаст новую форму.
Итак, ваша помощь приветствуется!
Поскольку ответ @mafu предлагает:
[Создают] пользовательское
NLog
[память]Target
и [ссылка] это кTextBox
.
Этот образец 'свяжет его' через event
и Делегаты обработчиков событий.
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.
}
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], она выполнится.