【问题标题】:ASP.NET Core WebApi - custom WinForms loggerASP.NET Core WebApi - 自定义 WinForms 记录器
【发布时间】:2021-11-17 16:47:46
【问题描述】:

如何添加一个注入到 ASP.NET Core WebApi 项目的Program 类的自定义记录器?
WebApi 托管在我想用于记录的 WinForms 应用程序中。,

WebApi 项目:

public class Program
{
    public IHost ApiHost { get; private set; }
    public Task ServerTask { get; private set; }

    public async Task Main(string[] args, CancellationToken token, ILogger logger)
    {
        ApiHost = CreateHostBuilder(args).Build();
        ServerTask = ApiHost.RunAsync(token);
        await ServerTask;
    }

    public IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
        .ConfigureLogging( // how to add my logger here?            
    }
}

WinForms 记录器:

public class UILogger : ILogger
{
    private readonly UILoggerProvider _provider;

    public UILogger(UILoggerProvider provider)
    {
        _provider = provider;
    }

    public IDisposable BeginScope<TState>(TState state)
    {
        return null;
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return logLevel != LogLevel.None;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        var logRecord = string.Format("{0} [{1}] {2} {3}", "[" + DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss+00:00") + "]", logLevel.ToString(), formatter(state, exception), exception != null ? exception.StackTrace : "");
        if(_provider.Options.LogControl != null)
        {
            var ctl = _provider.Options.LogControl;
            ctl.Invoke((MethodInvoker)(() =>
               {
                   ctl.AppendText(logRecord);
               }));
        }
    }
}

public class UILoggerOptions
{
    public RichTextBox LogControl { get; set; }
}

public class UILoggerProvider : ILoggerProvider
{
    public readonly UILoggerOptions Options;

    public UILoggerProvider(UILoggerOptions options)
    {
        Options = options;
    }

    public ILogger CreateLogger(string categoryName)
    {
        return new UILogger(this);
    }

    public void Dispose()
    {

    }
}

【问题讨论】:

  • 查看logging.AddConsole()logging.AddDebug() 扩展方法。
  • This 应该回答你的问题。
  • 我已经考虑过了,但是我需要在 WebApi 项目中实现 UILogger,这需要引用 System.Windows.Forms(使用 RichTextBox),这对我来说似乎不合适.
  • 没关系,想通了!我使用了 AddProvider 扩展方法,并在 WebApi 项目中注入了 UILoggerProvider。感谢您的提示。

标签: c# winforms asp.net-core asp.net-core-webapi


【解决方案1】:

使用AddProvider扩展方法并注入UILoggerProvider

public class Program
{
    public IHost ApiHost { get; private set; }
    public Task ServerTask { get; private set; }
    private ILoggerProvider provider;

    public async Task Main(string[] args, CancellationToken token, ILoggerProvider loggerProvider)
    {
        provider = loggerProvider;
        ApiHost = CreateHostBuilder(args).Build();
        ServerTask = ApiHost.RunAsync(token);
        await ServerTask;
    }

    public IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
        .ConfigureLogging(builder =>
        {
            builder.ClearProviders();
            builder.AddProvider(provider);
        });       
}

【讨论】:

  • 如何将 UILoggerOptions.LogControl 设置为表单中的控件?
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多