我正在尝试找出如何从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)
我想看到的是令牌请求成功还是失败以及原因,但是我什么都没看到。
我将如何完成Identity Server 4的更高级别的日志记录?
答案 0 :(得分:0)
您应该能够将记录器直接添加到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 Core DI也可以使用类似的方法。