首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Identity Server 4创建日志

为Identity Server 4创建日志
EN

Stack Overflow用户
提问于 2019-01-04 00:41:53
回答 1查看 1.8K关注 0票数 0

我正试图找出如何从Identity Server 4中获取更详细的日志,尤其是在出了问题时。我在这里读过他们的文档,http://docs.identityserver.io/en/latest/topics/logging.html,但是,我似乎无法让它起作用。首先,我不使用serilog,我在服务器上运行IS4,我没有远程访问权限,所以控制台日志不会对我起作用。

因此,我尝试注入我自己的自定义日志库,如下所示:

代码语言:javascript
复制
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);
    }
}

正如您所看到的,它非常简单,因为在这一点上,我不需要对它进行修饰,只需要它能够工作,并且在我完成示例工作后,我将在稍后对它进行适当的实现。

现在,为了设置这个,我在启动时做了:

代码语言:javascript
复制
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的更高级别的日志记录?

EN

回答 1

Stack Overflow用户

发布于 2019-01-04 11:43:39

您应该能够将您的记录器直接添加到WebHostBuilder中,这可能给您提供了最有洞察力的日志。

首先,您可以创建一个扩展方法来保持事物的整洁。我们只需要在DI中添加一个记录器工厂的单例。

代码语言:javascript
复制
    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;
    }

工厂本身就很简单。

代码语言:javascript
复制
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中。

代码语言:javascript
复制
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseCustomLogger();

最后,查看您的记录器实现--您需要在工厂中创建IDatabaseLoggerService实例,以便可以创建记录器。当然,类似的方法也可以用于ASP.NET核心DI。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54031759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档