简体   繁体   English

ASP.NET Core WebApi - 自定义 WinForms 记录器

[英]ASP.NET Core WebApi - custom WinForms logger

How do I add a custom logger which is injected to the Program class of a ASP.NET Core WebApi project?如何添加注入到 ASP.NET Core WebApi 项目的Program class 的自定义记录器?
The WebApi is hosted inside a WinForms App which I want to utilize for logging., WebApi 托管在我想用于记录的 WinForms 应用程序中。,

WebApi Project: 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 Logger: 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()
    {

    }
}

Used the AddProvider extension method and inject the UILoggerProvider使用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);
        });       
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM