首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Microsoft.Extensions.Logging订阅日志

如何从Microsoft.Extensions.Logging订阅日志
EN

Stack Overflow用户
提问于 2019-06-24 19:45:06
回答 1查看 87关注 0票数 0

如何将日志返回到UI?

我已经创建了一个自定义的记录器AudittrailLogger来记录到mssqlserver数据库。到目前为止,成功了,...日志将插入到数据库中。现在,我想在用户控件中显示高于某个日志级别的所有即将到来的日志。

我必须在configureLoggerFactory方法中传递委托/操作吗?

代码语言:javascript
复制
public void ConfigureLoggerFactory(string dbConnectionString)
{
    if (LoggerFactory == null)
    {
        LoggerFactory = new LoggerFactory()
            .AddAudittrailLogger(c =>
        {
            c.LogLevel = LogLevel.Trace;
            c.DbConnectionString = dbConnectionString;
        });
        CaliburnLog = LoggerFactory.CreateLogger("CaliburnMicro");
    }
}

在我看来,目前它看起来像:

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

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-26 18:09:44

用静态函数和静态事件解决了这个问题...

代码语言:javascript
复制
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方法中,只需调用静态函数来启动静态事件。

代码语言:javascript
复制
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中,我只需要订阅这个事件:

代码语言:javascript
复制
public MainViewModel(IEventAggregator eventAggregator)
{
    MyLogManager.OnLogReceived += OnLogReceived;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56735851

复制
相关文章

相似问题

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