2017-05-09 81 views
0

我建立了一个ASPNET核心应用程序,并启用日志与这些语句:如何控制Azure诊断日志的日志级别?

loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug((category, logLevel) => (category.Contains("WEBAPI") && logLevel >= LogLevel.Trace)); 
    loggerFactory.AddAzureWebAppDiagnostics(); 

现在的问题是,Azure的日志有很多其他的日志详细信息从我不感兴趣的Mircosoft包来的我似乎无法将我的日志记录配置传递给Azure,虽然我像控制台日志一样。

我是否缺少应该如何使用诊断系统?

+1

什么是在门户网站中设置的日志详细信息?您应该可以将该级别设置为警告。 – juunas

+0

@juunas它设置为详细,我的意思是要问我如何控制水平BY类别。这是我无法弄清楚的。 –

回答

1

当您在Azure门户中启用应用程序诊断时,您也可以选择Level。此设置允许您将捕获的信息过滤为信息,警告或错误信息。

enter image description here

详细级别装置日志系统将记录由应用程序产生的所有信息。

现在的问题是,Azure的日志有很多其他的日志详细信息从我不感兴趣的Mircosoft包来了。

你可以改变在Azure门户级别过滤日志您想要保存的内容。您可以随时在Azure门户上更改级别。与更改web.config文件不同,更改诊断日志级别不会回收应用程序运行的应用程序域。

我想从不属于我的类别中排除日志,只是我在配置的问题的第一行做了。

Azure Web App Logging扩展不支持按类别过滤日志。您可以创建一个新的记录器提供来实现此功能。

有3个步骤来完成它。

步骤1:添加需要实现ILogger接口的CustomLogger类。在本课中,我们可以按级别和类别过滤日志,并将日志消息保存到我们想要的任何地方。

public class CustomLogger : ILogger 
{ 

    private string _categoryName; 

    private Func<string, LogLevel, bool> _filter; 

    public CustomLogger(string categoryName, Func<string, LogLevel, bool> filter) 
    { 
     _categoryName = categoryName; 
     _filter = filter; 
    } 


    public IDisposable BeginScope<TState>(TState state) 
    { 
     return null; 
    } 

    public bool IsEnabled(LogLevel logLevel) 
    { 
     return (_filter == null || _filter(_categoryName, logLevel)); 
    } 

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) 
    { 

     if (!IsEnabled(logLevel)) 
     { 
      return; 
     } 

     if (formatter == null) 
     { 
      throw new ArgumentNullException(nameof(formatter)); 
     } 

     var message = formatter(state, exception); 

     if (string.IsNullOrEmpty(message)) 
     { 
      return; 
     } 

     message = [email protected]"Level: {logLevel} {message}"; 

     if (exception != null) 
     { 
      message += Environment.NewLine + Environment.NewLine + exception.ToString(); 
     } 

     //save message to any place you wanted 
    } 
} 

步骤2:添加这就需要实现ILoggerProvider接口CustomLoggerProvider类。在这个类中,我们将创建一个CustomerLogger实例来记录信息。

public class CustomLoggerProvider : ILoggerProvider 
{ 
    private readonly Func<string, LogLevel, bool> _filter; 

    public CustomLoggerProvider(Func<string, LogLevel, bool> filter) 
    { 
     _filter = filter; 
    } 

    public ILogger CreateLogger(string categoryName) 
    { 
     return new CustomLogger(categoryName, _filter); 
    } 

    public void Dispose() 
    { 

    } 
} 

步骤3:添加其用于CustomLoggerProvider实例添加到记录器工厂CustomLoggerExtensions类。

public static class CustomLoggerExtensions 
{ 
    public static ILoggerFactory AddCustom(this ILoggerFactory factory, 
              Func<string, LogLevel, bool> filter = null) 
    { 
     factory.AddProvider(new CustomLoggerProvider(filter)); 
     return factory; 
    } 
} 

上面的步骤后,我们可以使用这个自定义记录器使用下面的代码。

loggerFactory.AddCustom((category, logLevel) => (category.Contains("WEBAPI") && logLevel >= LogLevel.Trace)); 
+0

这是很棒的信息!但我真正的意思是我想根据类别进行过滤......我想从不是我的类别中排除日志,只是在我的问题的第一行中使用config进行排序。 –

+0

我很抱歉误会你的问题。我根据您的评论更新了我的回复。 – Amor

+0

哇!现在,这是一个答案!非常感谢。 –