如何解决如何使用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的代码,它可以写入文件,eventLog,控制台等,但是我找不到将Windows附加到记录器并在其中写入的方法。修改后,我得到了以下内容:
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的自定义记录器接收器:
bq update --require_partition_filter=FALSE your_project_id:dataset.table_name
创建Serilog记录器时,添加您的自定义接收器。我使用静态接收器/记录器,因此可以从任何地方访问它。
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; }
}
在您的视图/窗体中有TextBox / RichTextBox(在我的情况下为this.logTextBox)中,添加事件处理程序:
public static TbsLoggerSink LoggerSink = new TbsLoggerSink();
public static readonly Serilog.Core.Logger Log = new LoggerConfiguration()
.WriteTo.Sink(LoggerSink)
.CreateLogger();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。