Создание журналов для Identity Server 4 - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь выяснить, как получить более подробные журналы из 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 голосов
/ 04 января 2019

Вы должны быть в состоянии добавить свой регистратор прямо в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...