Как подписаться на логи от Microsoft.Extensions.Logging - PullRequest
0 голосов
/ 24 июня 2019

Как вернуть логи обратно в интерфейс?

Я создал собственный Logger AudittrailLogger для входа в базу данных mssqlserver. Успешно до сих пор, ... журналы будут вставлены в базу данных. Теперь мне нравится показывать все предстоящие журналы выше определенного уровня в пользовательском контроле.

Нужно ли передавать делегат / действие в методе configureLoggerFactory?

public void ConfigureLoggerFactory(string dbConnectionString)
{
    if (LoggerFactory == null)
    {
        LoggerFactory = new LoggerFactory()
            .AddAudittrailLogger(c =>
        {
            c.LogLevel = LogLevel.Trace;
            c.DbConnectionString = dbConnectionString;
        });
        CaliburnLog = LoggerFactory.CreateLogger("CaliburnMicro");
    }
}

На мой взгляд, сейчас это выглядит так:

private ILogger Log { get; set; }

public MainViewModel(IEventAggregator eventAggregator)
{
    ....
    Log = _LogManager.LoggerFactory.CreateLogger<MainViewModel>();

    // now I like to subscribe to the logs to show them in the UI
    _LogManager.OnLogReceived += OnLogReceived;

В качестве альтернативы я пишу второй пользовательский LoggingProvider. Но я все еще не понимаю, как мне отправить сообщение журнала обратно в пользовательский интерфейс.

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
    // *** this single line is not working yet *** How to inform the subscribers?
    OnLogReceived?.Invoke(this, new LogReceivedEventArgs(formatter(state, exception), logLevel));

    // save to database via EntityFramework - this could be skipped/deleted in a second LoggingProvider 
    using (var dbContext = new MyDbContext(_Config.DbConnectionString))
    {
        dbContext.LogEntries.Add(new Models.LogEntry()
        {
            TimeStampUtc = DateTime.UtcNow,
            Level = logLevel,
            Source = _Name, 
            EventId = eventId.Id, 
            EventIdName = eventId.Name,
            MachineName = Environment.MachineName,
            UserName = Environment.UserName,
            LogMessage = formatter(state, exception),
            Exception = exception?.Message, 
            StackTrace = exception?.StackTrace
        });
        dbContext.SaveChanges();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...