Azure Application Insights結合NLog擴大企業運用

Application Insights功能多好用,之前已經有提過,不過,在Application Insights前,大部分開發者都會用NLog來做Log蒐集器,如果,要大家改用Application Insights話,難不成之前有寫Log的地方,都要改用TelemetryClient.TrackEvent方式改寫嗎?這樣似乎會讓系統改到天荒地暗,企業內部的系統又多的跟山一樣,要一一改進似乎不太可能

還好我們可以透過Application Insights NLog Target的套件

讓我們原本用NLog儲存的資訊,直接透過此套件傳送到Application Insights中,例如原本是

1
2
3
4
5
6
7
private readonly ILogger _logger;
Publid void Test()
{
_logger = LogManager.GetCurrentClassLogger();
_logger.Error("Error: Parameter is empty2."); _logger.Warn("TEST1");
}

安裝好套件好,會出現一個警告訊息

如果你有用到NLog.Config時候,必須移除Targets,extensionsrules這幾個Tag,主要是因為這些Tag會放到web.config中或App.config

1
2
3
<configSections> <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" /> </configSections>
.........
<nlog> <extensions> <add assembly="Microsoft.ApplicationInsights.NLogTarget" /> </extensions> <targets> <target type="ApplicationInsightsTarget" name="aiTarget" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="aiTarget" /> </rules> </nlog>

這樣原本的程式一行都不用改唷,就可以搬到NLog中,如果想要混搭原本TelemetryClient語法也是可以的,並不會受限制,不過,若是你依舊想要原本在Local端也可以繼續記錄Log話,只要把原本在NLog.Config中你的設定值,例如下面

1
<target type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" maxArchiveFiles="30" concurrentWrites="true" /> <target type="Debugger" name="debugger" layout="${longdate} ${uppercase:${level}} ${message}"/>

搬到App.config或是Web.config的NLog Tag下面就可以囉,同時地端與雲端都存放Log,這樣方式就可以增加運用彈性了