【发布时间】: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