我正试图找出如何从Identity Server 4中获取更详细的日志,尤其是在出了问题时。我在这里读过他们的文档,http://docs.identityserver.io/en/latest/topics/logging.html,但是,我似乎无法让它起作用。首先,我不使用serilog,我在服务器上运行IS4,我没有远程访问权限,所以控制台日志不会对我起作用。
因此,我尝试注入我自己的自定义日志库,如下所示:
public class Temp : IDisposable
{
public void Dispose() { }
}
public class CustomLogger : ILogger
{
private readonly IDatabaseLoggerService _databaseLoggerService;
public CustomLogger(IDatabaseLoggerService databaseLoggerService)
{
_databaseLoggerService = databaseLoggerService;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if(exception == null) return;
_databaseLoggerService.Fatal(new LogErrorDetails
{
Exception = exception,
Message = "LIS - " + formatter
});
}
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public IDisposable BeginScope<TState>(TState state)
{
return new Temp();
}
}
public class CustomLoggerProvider : ILoggerProvider
{
private readonly IDatabaseLoggerService _databaseLoggerService;
public CustomLoggerProvider(IDatabaseLoggerService databaseLoggerService)
{
_databaseLoggerService = databaseLoggerService;
}
public void Dispose() { }
public ILogger CreateLogger(string categoryName)
{
return new CustomLogger(_databaseLoggerService);
}
}正如您所看到的,它非常简单,因为在这一点上,我不需要对它进行修饰,只需要它能够工作,并且在我完成示例工作后,我将在稍后对它进行适当的实现。
现在,为了设置这个,我在启动时做了:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//code emmited
var serviceProvider = app.ApplicationServices;
var dbLogger = serviceProvider.GetService<IDatabaseLoggerService>();
loggerFactory.AddProvider(new CustomLoggerProvider(dbLogger));
}然而,我没有看到任何关于它的日志,我唯一看到的是偶尔出现的防伪造令牌错误,这就是:
( Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)在Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.GetCookieTokenDoesNotThrow(HttpContext httpContext)
我希望看到的是一个令牌请求是否成功,或者它是否失败,以及为什么,但我没有看到其中的任何一个。
我将如何实现身份服务器4的更高级别的日志记录?
发布于 2019-01-04 11:43:39
您应该能够将您的记录器直接添加到WebHostBuilder中,这可能给您提供了最有洞察力的日志。
首先,您可以创建一个扩展方法来保持事物的整洁。我们只需要在DI中添加一个记录器工厂的单例。
public static IWebHostBuilder UseCustomLogger(this IWebHostBuilder builder, CustomLogger logger = null, bool dispose = false)
{
if (builder == null) throw new ArgumentNullException(nameof(builder));
builder.ConfigureServices(collection =>
collection.AddSingleton<ILoggerFactory>(services => new CustomLoggerFactory(logger, dispose)));
return builder;
}工厂本身就很简单。
public class CustomLoggerFactory : ILoggerFactory
{
private readonly CustomLoggerProvider _provider;
public CustomLoggerFactory(ILogger logger = null, bool dispose = false)
{
_provider = new CustomLoggerProvider(logger, dispose);
}
public void Dispose()
{
_provider.Dispose();
}
public Microsoft.Extensions.Logging.ILogger CreateLogger(string categoryName)
{
return _provider.CreateLogger(categoryName);
}
}然后,可以将记录器添加到Program.cs中。
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseCustomLogger();最后,查看您的记录器实现--您需要在工厂中创建IDatabaseLoggerService实例,以便可以创建记录器。当然,类似的方法也可以用于ASP.NET核心DI。
https://stackoverflow.com/questions/54031759
复制相似问题