我正试图弄清楚如何配置Blazor和Serilog,以便能够呈现一个组件,该组件将在剃刀页面上显示日志输出。我已经广泛搜索了一个专门使用Blazor/Asp的例子。Net Core和都有所不足。
如果我的启动中有以下内容:
myServiceCollection.AddLogging(l =>
{
l.ClearProviders();
l.AddConsole();
l.SetMinimumLevel(LogLevel.Debug);
});
然后在另一个组件中,我注入了一个ILogger
,我如何不登录到控制台,而是将日志重定向到我在有问题的剃刀组件上的某个<textarea>
或<p>
?我基本上只想设置一个日志查看器页面,或者能够在任何任意组件上显示日志的输出。
虽然我还没有找到一个具体的例子来满足我的要求,但有很多Blazor聊天应用程序使用SignalR在用户之间进行实时聊天的例子。我的想法是,我可以重新利用它,而不是在用户之间使用聊天应用程序,我只是";聊天";在服务器和客户端之间,其中消息是输出的日志行。这会是最好的方法吗?
您可以创建一个自定义记录器。我设法让这个教程聊天应用工作
Startup.cs
loggerFactory.AddProvider(
new SignalRLoggerProvider(
new SignalRLoggerConfiguration
{
HubContext = serviceProvider.GetService<IHubContext<BlazorChatSampleHub>>(),
LogLevel = LogLevel.Information
}));
public class SignalRLoggerProvider : ILoggerProvider
{
private readonly SignalRLoggerConfiguration _config;
private readonly ConcurrentDictionary<string, SignalRLogger> _loggers = new ConcurrentDictionary<string, SignalRLogger>();
public SignalRLoggerProvider(SignalRLoggerConfiguration config)
{
_config = config;
}
public ILogger CreateLogger(string categoryName)
{
return _loggers.GetOrAdd(categoryName, name => new SignalRLogger(name, _config));
}
public void Dispose()
{
_loggers.Clear();
}
}
public class SignalRLogger : ILogger
{
private readonly string _name;
private readonly SignalRLoggerConfiguration _config;
public SignalRLogger(string name, SignalRLoggerConfiguration config)
{
_name = name;
_config = config;
}
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return logLevel == _config.LogLevel;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state,
Exception exception, Func<TState, Exception, string> formatter)
{
if (!IsEnabled(logLevel))
{
return;
}
if (_config.EventId == 0 || _config.EventId == eventId.Id)
{
this._config.HubContext?.Clients.Group(_config.GroupName).SendAsync("Broadcast", "LOGGER", $"{DateTimeOffset.UtcNow:T}-UTC : {formatter(state, exception)}");
}
}
}
概念验证