【问题标题】:How to output logs with Serilog to a textbox in Winform?如何使用 Serilog 将日志输出到 Winform 中的文本框?
【发布时间】: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;
            }}

有人可以指导我吗?有人有一个例子或者解释我错过了什么吗?

【问题讨论】:

标签: c# .net winforms serilog


【解决方案1】:

也许我帮助你有点晚了,但这就是我实现它的方式:

自定义 logger sink,有 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; }
    }

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

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}";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2021-07-13
    相关资源
    最近更新 更多