如何将带有Serilog的日志输出到Winform中的文本框中



帮助!

我不知道如何实现Serilog,将我的日志实时输出到Winforms的文本框中。我有一个用.Net C#编写的应用程序,它是很久以前编写的,具有日志框架log4net。我有不同的附加程序,其中一个是在我的代码中创建的:

public class ExAppender : AppenderSkeleton{
private IExAppender control = null;
public void AttachControl(IExAppender obj)
{ this.control = obj;}
protected override void Append(LoggingEvent loggingEvent)
{
try
{
string message = RenderLoggingEvent(loggingEvent);
if (this.control != null)
{
this.control.LogMessage(message, loggingEvent.Level.Name);
}
}catch{// ignore}
}

在那之后,我有了另一个类定义的ExLogger:

public static class ExLogger
{ private static readonly ILog LoggerObj = null;
public static bool AttachControl(IExAppender obj)
{
IAppender[] appenders = LoggerObj.Logger.Repository.GetAppenders();
(appender as ExAppender).AttachControl(obj);
return true;
}
return false;}

我在app.config中定义了我的serilog记录器,我想从那里读取它们,因为我有多个记录器,我认为我需要使用公共类ExAppender:ILogEventSink,我替换了旧代码以适合serilog,它写入文件、事件日志、控制台等,但我找不到将窗口附加到记录器并在那里写入的方法。经过我的修改,我得到了这样的东西:

public class ExAppender : ILogEventSink
{
public ExAppender control = null;
public ConcurrentQueue<string> Events { get; } = new ConcurrentQueue<string>();
public void AttachControl(IExAppender  obj)
{
this.control = obj;
}
public void Emit(LogEvent logEvent)
{
if (logEvent == null) throw new ArgumentNullException(nameof(logEvent));
var renderSpace = new ExAppender();
Events.Enqueue(renderSpace.ToString());
try
{   string message = logEvent.RenderMessage();
if (this.control != null)
{
this.control.LogMessage(message, logEvent.Level.ToString());
}
}catch { }
}

对于ExLogger类:

public static bool AttachControl( IExAppender obj)
{try
{               
ILogger test = new LoggerConfiguration()
.ReadFrom.AppSettings(settingPrefix: "ExAppender")
.WriteTo.ExAppender(restrictedToMinimumLevel: LogEventLevel.Information)
.CreateLogger();
return true;
}catch
{
return false;
}}

有人能给我指路吗?是否有人举了一个例子,或者可能解释了我遗漏了什么?

也许我来不及帮你了,但我就是这样实现的:

自定义记录器接收器,具有EventHandler:

public class TbsLoggerSink : ILogEventSink
{
public event EventHandler NewLogHandler;
public TbsLoggerSink() { }
public void Emit(LogEvent logEvent)
{
#if DEBUG
Console.WriteLine($"{logEvent.Timestamp}] {logEvent.MessageTemplate}");
#endif
NewLogHandler?.Invoke(typeof(TbsCore.Helpers.TbsLoggerSink), new LogEventArgs() { Log = logEvent });
}
}
public class LogEventArgs : EventArgs
{
public LogEvent Log { get; set; }
}

创建序列号记录器时,请添加自定义接收器。我使用静态接收器/记录器,所以我可以从任何地方访问它。

public static TbsLoggerSink LoggerSink = new TbsLoggerSink();
public static readonly Serilog.Core.Logger Log = new LoggerConfiguration()
.WriteTo.Sink(LoggerSink)
.CreateLogger();

在您的视图/表单中,有TextBox/RichTextBox(在我的例子中是this.logTextBox(,添加事件处理程序:

public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
Utils.LoggerSink.NewLogHandler += LogHandler;
}
private void LogHandler(object sender, EventArgs e)
{
var log = ((LogEventArgs)e).Log;
this.logTextBox.Text = $"{log.Timestamp.DateTime.ToString("HH:mm:ss")}: {log.MessageTemplate}n{this.logTextBox.Text}";
}
}

最新更新