如何添加注入到ProgramASP.NET Core WebApi 專案類的自定義記錄器?
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()
{
}
}
uj5u.com熱心網友回復:
使用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);
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/365949.html
標籤:C# winforms asp.net核心 asp.net-core-webapi
上一篇:C#WinForms(.NETFramework)DataGridViewwithButton、ComboBox&TextBox:使用按鈕添加新行以添加組合框項時出錯
