[英]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.