为Identity Server 4创建日志

时间:2019-01-04 00:41:53

标签: c# logging identityserver4

我正在尝试找出如何从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的更高级别的日志记录?

1 个答案:

答案 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也可以使用类似的方法。