【发布时间】:2020-08-14 07:10:17
【问题描述】:
救命!
我无法弄清楚如何实现 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 记录器,我想从那里读取它们,因为我有多个记录器,我认为我需要使用 public class 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;
}}
有人可以指导我吗?有人有一个例子或者解释我错过了什么吗?
【问题讨论】:
-
适用于 Serilog:stackoverflow.com/questions/18726852/…
-
最好实现一个 Serilog 接收器:github.com/serilog/serilog/wiki/Developing-a-sink