2017-05-09 78 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

哇!現在,這是一個答案!非常感謝。 –