如何将日志返回到UI?
我已经创建了一个自定义的记录器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。但是我仍然不知道如何将日志消息发送回UI。
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();
}
}发布于 2019-08-26 18:09:44
用静态函数和静态事件解决了这个问题...
public delegate void LogReceived(Object sender, LogReceivedEventArgs args);
public class MyLogManager : Caliburn.Micro.ILog
{
public static event LogReceived OnLogReceived;
public static void ShowLog(string msg, LogLevel logLevel)
{
OnLogReceived?.Invoke(_Instance, new LogReceivedEventArgs(msg, logLevel));
}然后,在Log方法中,只需调用静态函数来启动静态事件。
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (logLevel > LogLevel.Debug)
MyLogManager.ShowLog(formatter(state, exception), logLevel);在我的MainViewModel中,我只需要订阅这个事件:
public MainViewModel(IEventAggregator eventAggregator)
{
MyLogManager.OnLogReceived += OnLogReceived;https://stackoverflow.com/questions/56735851
复制相似问题