Как вернуть логи обратно в интерфейс?
Я создал собственный 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();
}
}