整體架構目錄: ASP.NET Core分布式項目實戰-目錄
一、介紹
此篇文章将會介紹項目的全局異常收集以及采用log4net或者NLog記錄。
衆所周知,一旦自己的項目報錯,如果沒有進行處理都是顯示不友好的,有得甚至直接爆出錯誤頁面,看的也是很奇怪。
為了避免出現這樣的錯誤以及在錯誤出現的時候可以進行收集錯誤,供維護人員進行bug修改,是以需要進行全局異常的收集。
讓我們開始部署吧。
此篇文章的目錄
1、log4net使用
2、Nlog使用
後期将會把NLog+ELK進行結合部署收集我們的asp.net core的項目。大家可以拭目以待吧。
二、部署(log4net使用)
1、建立一個asp.net core webapi的項目
然後目前我先引入 log4net nuget包。

2、然後建立一個log4net.config檔案
此檔案中,我建立了一個是記錄 錯誤的檔案夾(LogError)以及是記錄操作的檔案夾(LogInfo),代碼如下:我把需要記錄的檔案放在了log檔案夾下面。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<log4net>
<!-- 錯誤日志類-->
<logger name=<span style="color: #800000;">"</span><span style="color: #800000;">logerror</span><span style="color: #800000;">"</span>>
<level value=<span style="color: #800000;">"</span><span style="color: #800000;">ALL</span><span style="color: #800000;">"</span> />
<appender-<span style="color: #0000ff;">ref</span> <span style="color: #0000ff;">ref</span>=<span style="color: #800000;">"</span><span style="color: #800000;">ErrorAppender</span><span style="color: #800000;">"</span> />
</logger>
<!-- 錯誤日志附加媒體-->
<appender name=<span style="color: #800000;">"</span><span style="color: #800000;">ErrorAppender</span><span style="color: #800000;">"</span> type=<span style="color: #800000;">"</span><span style="color: #800000;">log4net.Appender.RollingFileAppender</span><span style="color: #800000;">"</span>>
<!--日志檔案路徑-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">File</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><strong><span style="color: #ff0000;">Log\\LogError\\</span></strong><span style="color: #800000;">"</span> />
<!--是否是向檔案中追加日志-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">AppendToFile</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span> />
<!--log保留天數-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">MaxSizeRollBackups</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">1000</span><span style="color: #800000;">"</span> />
<!--最大檔案大小-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">MaxFileSize</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">10240</span><span style="color: #800000;">"</span> />
<!--日志檔案名是否是固定不變的-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">StaticLogFileName</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">false</span><span style="color: #800000;">"</span> />
<!--日志檔案名格式為:<span style="color: #800080;">2008</span>-<span style="color: #800080;">08</span>-<span style="color: #800080;">31</span>.log-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">DatePattern</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">yyyy-MM-dd&quot;.htm&quot;</span><span style="color: #800000;">"</span> />
<!--日志根據日期滾動-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">RollingStyle</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">Date</span><span style="color: #800000;">"</span> />
<!--資訊日志布局-->
<layout type=<span style="color: #800000;">"</span><span style="color: #800000;">log4net.Layout.PatternLayout</span><span style="color: #800000;">"</span>>
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">ConversionPattern</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">&lt;HR COLOR=red&gt;%n【異常時間】:%d [%t] &lt;BR&gt;%n【異常級别】:%-5p &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;</span><span style="color: #800000;">"</span> />
</layout>
</appender>
<!-- 資訊日志類 -->
<logger name=<span style="color: #800000;">"</span><span style="color: #800000;">loginfo</span><span style="color: #800000;">"</span>>
<level value=<span style="color: #800000;">"</span><span style="color: #800000;">ALL</span><span style="color: #800000;">"</span> />
<appender-<span style="color: #0000ff;">ref</span> <span style="color: #0000ff;">ref</span>=<span style="color: #800000;">"</span><span style="color: #800000;">InfoAppender</span><span style="color: #800000;">"</span> />
</logger>
<!-- 資訊日志附加媒體-->
<appender name=<span style="color: #800000;">"</span><span style="color: #800000;">InfoAppender</span><span style="color: #800000;">"</span> type=<span style="color: #800000;">"</span><span style="color: #800000;">log4net.Appender.RollingFileAppender</span><span style="color: #800000;">"</span>>
<!--日志檔案路徑-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">File</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><strong><span style="color: #ff0000;">Log\\LogInfo\\</span></strong><span style="color: #800000;">"</span> />
<!--是否是向檔案中追加日志-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">AppendToFile</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span> />
<!--log保留天數-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">MaxSizeRollBackups</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">100</span><span style="color: #800000;">"</span> />
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">MaxFileSize</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span> />
<!--日志檔案名是否是固定不變的-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">StaticLogFileName</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">false</span><span style="color: #800000;">"</span> />
<!--日志檔案名格式為:<span style="color: #800080;">2008</span>-<span style="color: #800080;">08</span>-<span style="color: #800080;">31</span>.log-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">DatePattern</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">yyyy-MM-dd&quot;.htm&quot;</span><span style="color: #800000;">"</span> />
<!--日志根據日期滾動-->
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">RollingStyle</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">Date</span><span style="color: #800000;">"</span> />
<!--資訊日志布局-->
<layout type=<span style="color: #800000;">"</span><span style="color: #800000;">log4net.Layout.PatternLayout</span><span style="color: #800000;">"</span>>
<param name=<span style="color: #800000;">"</span><span style="color: #800000;">ConversionPattern</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">&lt;HR COLOR=blue&gt;%n日志時間:%d [%t] &lt;BR&gt;%n日志級别:%-5p &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;</span><span style="color: #800000;">"</span> />
</layout>
</appender>
</log4net>
<!-- To customize the asp.net core module uncomment and edit the following section.
For more info see
https:style="color: #008000;">//go.microsoft.com/fwlink/?linkid=838655 -->
<!--
<system.webServer>
<handlers>
<remove name=<span style="color: #800000;">"</span><span style="color: #800000;">aspNetCore</span><span style="color: #800000;">"</span>/>
<add name=<span style="color: #800000;">"</span><span style="color: #800000;">aspNetCore</span><span style="color: #800000;">"</span> path=<span style="color: #800000;">"</span><span style="color: #800000;">*</span><span style="color: #800000;">"</span> verb=<span style="color: #800000;">"</span><span style="color: #800000;">*</span><span style="color: #800000;">"</span> modules=<span style="color: #800000;">"</span><span style="color: #800000;">AspNetCoreModule</span><span style="color: #800000;">"</span> resourceType=<span style="color: #800000;">"</span><span style="color: #800000;">Unspecified</span><span style="color: #800000;">"</span>/>
</handlers>
<aspNetCore processPath=<span style="color: #800000;">"</span><span style="color: #800000;">%LAUNCHER_PATH%</span><span style="color: #800000;">"</span> arguments=<span style="color: #800000;">"</span><span style="color: #800000;">%LAUNCHER_ARGS%</span><span style="color: #800000;">"</span> stdoutLogEnabled=<span style="color: #800000;">"</span><span style="color: #800000;">false</span><span style="color: #800000;">"</span> stdoutLogFile=<span style="color: #800000;">"</span><span style="color: #800000;">.\logs\stdout</span><span style="color: #800000;">"</span> />
</system.webServer>
-->
</configuration>
3、在asp.net core項目中 Startup.cs 中需要添加初始化log4net的倉儲名,主要是用來給log4net标記一個名稱,這邊可以随意。
4、在項目中建立一個類用來記錄log的日志格式以及資料分類存放
建立LogHelper.cs,
定義log格式,當然自己可以随意定義哈。
#region 全局異常錯誤記錄持久化
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 全局異常錯誤記錄持久化
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="throwMsg"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="ex"></param></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> ErrorLog(<span style="color: #0000ff;">string</span><span style="color: #000000;"> throwMsg, Exception ex)
{
</span><span style="color: #0000ff;">string</span> errorMsg = <span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">【抛出資訊】:{0} <br>【異常類型】:{1} <br>【異常資訊】:{2} <br>【堆棧調用】:{3}</span><span style="color: #800000;">"</span>, <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">object</span><span style="color: #000000;">[] { throwMsg,
ex.GetType().Name, ex.Message, ex.StackTrace });
errorMsg </span>= errorMsg.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;"><br></span><span style="color: #800000;">"</span><span style="color: #000000;">);
errorMsg </span>= errorMsg.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">位置</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;"><strong style=\"color:red\">位置</strong></span><span style="color: #800000;">"</span><span style="color: #000000;">);
logerror.Error(errorMsg);
}
</span><span style="color: #0000ff;">#endregion</span></pre>
#region 自定義操作記錄
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 自定義操作記錄,與倉儲中的增删改的日志是記錄同一張表
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="throwMsg"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="ex"></param></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> WriteLog(<span style="color: #0000ff;">string</span><span style="color: #000000;"> throwMsg, Exception ex)
{
</span><span style="color: #0000ff;">string</span> errorMsg = <span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">【抛出資訊】:{0} <br>【異常類型】:{1} <br>【異常資訊】:{2} <br>【堆棧調用】:{3}</span><span style="color: #800000;">"</span>, <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">object</span><span style="color: #000000;">[] { throwMsg,
ex.GetType().Name, ex.Message, ex.StackTrace });
errorMsg </span>= errorMsg.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;"><br></span><span style="color: #800000;">"</span><span style="color: #000000;">);
errorMsg </span>= errorMsg.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">位置</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;"><strong style=\"color:red\">位置</strong></span><span style="color: #800000;">"</span><span style="color: #000000;">);
logerror.Error(errorMsg);
}
</span><span style="color: #0000ff;">#endregion</span></pre>
5、有了以上的log格式,這樣我就開始定義一下全局異常處理吧
我這邊先建立一個全局異常處理類 GlobalExceptions.cs 然後需要在startup.cs中注入
在ConfigureServices 方法中注入。
//注入全局異常捕獲
services.AddMvc(o =>
{
o.Filters.Add(typeof(GlobalExceptions));
});
6、GlobalExceptions類中添加處理,當然異常需要繼承IExceptionFilter。
代碼如下:
GlobalExceptions
public class GlobalExceptions : IExceptionFilter
{
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">readonly</span><span style="color: #000000;"> IHostingEnvironment _env;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> GlobalExceptions(IHostingEnvironment env)
{
_env </span>=<span style="color: #000000;"> env;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> OnException(ExceptionContext context)
{
</span><span style="color: #0000ff;">var</span> json = <span style="color: #0000ff;">new</span><span style="color: #000000;"> JsonErrorResponse();
</span><span style="color: #008000;">//</span><span style="color: #008000;">這裡面是自定義的操作記錄日志</span>
<span style="color: #0000ff;">if</span> (context.Exception.GetType() == <span style="color: #0000ff;">typeof</span><span style="color: #000000;">(UserOperationException))
{
json.Message </span>=<span style="color: #000000;"> context.Exception.Message;
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (_env.IsDevelopment())
{
json.DevelopmentMessage </span>= context.Exception.StackTrace;<span style="color: #008000;">//</span><span style="color: #008000;">堆棧資訊</span>
}
context.Result </span>= <span style="color: #0000ff;">new</span> BadRequestObjectResult(json);<span style="color: #008000;">//</span><span style="color: #008000;">傳回異常資料</span>
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
json.Message </span>= <span style="color: #800000;">"</span><span style="color: #800000;">發生了未知内部錯誤</span><span style="color: #800000;">"</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (_env.IsDevelopment())
{
json.DevelopmentMessage </span>= context.Exception.StackTrace;<span style="color: #008000;">//</span><span style="color: #008000;">堆棧資訊</span>
context.Result </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> InternalServerErrorObjectResult(json);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">采用log4net 進行錯誤日志記錄</span>
LogHelper.ErrorLog(json.Message, context.Exception);
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> InternalServerErrorObjectResult : ObjectResult
{
</span><span style="color: #0000ff;">public</span> InternalServerErrorObjectResult(<span style="color: #0000ff;">object</span> value) : <span style="color: #0000ff;">base</span><span style="color: #000000;">(value)
{
StatusCode </span>=<span style="color: #000000;"> StatusCodes.Status500InternalServerError;
}
}</span></pre>
JsonErrorResponse.cs
public class JsonErrorResponse
{
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 生産環境的消息
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Message { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 開發環境的消息
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> DevelopmentMessage { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
}</span></pre>
UserOperationException.cs
/// <summary>
<span style="color: #808080;">///</span><span style="color: #008000;"> 記錄檔
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> UserOperationException : Exception
{
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> UserOperationException() { }
</span><span style="color: #0000ff;">public</span> UserOperationException(<span style="color: #0000ff;">string</span> message) : <span style="color: #0000ff;">base</span><span style="color: #000000;">(message) { }
</span><span style="color: #0000ff;">public</span> UserOperationException(<span style="color: #0000ff;">string</span> message, Exception innerException) : <span style="color: #0000ff;">base</span><span style="color: #000000;">(message, innerException) { }
}</span></pre>
自此,全局異常配置完成,然後我們可以測試一下,随便寫一個除以0的代碼在日志記錄中就會出現如下的展示:
哇,發現我的錯誤日志的格式非常的清楚,當然這個跟我的做事态度以及性格有很大的關系的啦,畢竟樓主還是很帥的。哈哈哈。
三、NLog使用
1、在項目中添加nlog的nuget包引入,“NLog.Web.AspNetCore”
2、建立nlog.config檔案,大家會發現我的log格式跟上面的格式操作,而且我的分層層次也很清楚。哈哈.
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns=" http://www.nlog-project.org/schemas/NLog.xsd style="color: #800000;">"
xmlns:xsi</span>=<span style="color: #800000;">"</span><span style="color: #800000;">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #800000;">"</span><span style="color: #000000;">
autoReload</span>=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span>>
<!-- the targets to write to -->
<targets>
<!-- 輸出到檔案,這個檔案記錄所有的日志 -->
<target xsi:type=<span style="color: #800000;">"</span><span style="color: #800000;">File</span><span style="color: #800000;">"</span> name=<span style="color: #800000;">"</span><span style="color: #800000;">allfile</span><span style="color: #800000;">"</span> fileName=<span style="color: #800000;">"</span><span style="color: #800000;">Log\LogAll\${shortdate}.htm</span><span style="color: #800000;">"</span><span style="color: #000000;">
layout</span>=<span style="color: #800000;">"</span><span style="color: #800000;">&lt;HR COLOR=red&gt;${longdate}&lt;BR&gt;${logger}&lt;BR&gt;${uppercase:${level}}&lt;BR&gt;${message} ${exception}&lt;HR Size=1&gt;</span><span style="color: #800000;">"</span> />
<!-- 輸出到檔案,這個檔案記錄錯誤日志 -->
<target xsi:type=<span style="color: #800000;">"</span><span style="color: #800000;">File</span><span style="color: #800000;">"</span> name=<span style="color: #800000;">"</span><span style="color: #800000;">logError</span><span style="color: #800000;">"</span> fileName=<span style="color: #800000;">"</span><span style="color: #800000;">Log\LogError\${shortdate}.htm</span><span style="color: #800000;">"</span><span style="color: #000000;">
layout</span>=<span style="color: #800000;">"</span><span style="color: #800000;">&lt;HR COLOR=red&gt;【異常時間】:${date} &lt;BR&gt;【異常級别】:${level:uppercase=true} &lt;BR&gt;${message}&lt;HR Size=1&gt;</span><span style="color: #800000;">"</span> />
<!-- 輸出到檔案,這個檔案記錄記錄檔 -->
<target xsi:type=<span style="color: #800000;">"</span><span style="color: #800000;">File</span><span style="color: #800000;">"</span> name=<span style="color: #800000;">"</span><span style="color: #800000;">logInfo</span><span style="color: #800000;">"</span> fileName=<span style="color: #800000;">"</span><span style="color: #800000;">Log\LogInfo\${shortdate}.htm</span><span style="color: #800000;">"</span><span style="color: #000000;">
layout</span>=<span style="color: #800000;">"</span><span style="color: #800000;">&lt;HR COLOR=red&gt;【操作時間】:${date} &lt;BR&gt;【操作級别】:${level:uppercase=true} &lt;BR&gt;${message}&lt;HR Size=1&gt;</span><span style="color: #800000;">"</span> />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including <span style="color: #0000ff;">from</span> Microsoft-->
<logger name=<span style="color: #800000;">"</span><span style="color: #800000;">*</span><span style="color: #800000;">"</span> minlevel=<span style="color: #800000;">"</span><span style="color: #800000;">Trace</span><span style="color: #800000;">"</span> writeTo=<span style="color: #800000;">"</span><span style="color: #800000;">allfile</span><span style="color: #800000;">"</span> />
<logger name=<span style="color: #800000;">"</span><span style="color: #800000;">*</span><span style="color: #800000;">"</span> minlevel=<span style="color: #800000;">"</span><span style="color: #800000;">Error</span><span style="color: #800000;">"</span> writeTo=<span style="color: #800000;">"</span><span style="color: #800000;">logError</span><span style="color: #800000;">"</span> />
<logger name=<span style="color: #800000;">"</span><span style="color: #800000;">*</span><span style="color: #800000;">"</span> minlevel=<span style="color: #800000;">"</span><span style="color: #800000;">Info</span><span style="color: #800000;">"</span> writeTo=<span style="color: #800000;">"</span><span style="color: #800000;">logInfo</span><span style="color: #800000;">"</span> />
<logger name=<span style="color: #800000;">"</span><span style="color: #800000;">Microsoft.*</span><span style="color: #800000;">"</span> maxLevel=<span style="color: #800000;">"</span><span style="color: #800000;">Info</span><span style="color: #800000;">"</span> final=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span> />
</rules>
</nlog>
注:然後将此檔案點選右鍵,選擇屬性,把複制輸出目錄修改為“始終複制”,無法不修改,則會無法加載此檔案。
3、在startup.cs中的 Configure方法注入
//ILoggerFactory loggerFactory
loggerFactory.AddNLog();
NLog.LogManager.LoadConfiguration("nlog.config"); //填入上面建立的檔案的名稱
然後運作以下即可看到在bin/debug下面生成檔案夾
4、建立NLogHelp.cs類
public class NLogHelp
{
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> Logger logger =<span style="color: #000000;"> LogManager.GetCurrentClassLogger();
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> ErrorLog(<span style="color: #0000ff;">string</span><span style="color: #000000;"> throwMsg, Exception ex)
{
</span><span style="color: #0000ff;">string</span> errorMsg = <span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">【異常資訊】:{0} <br>【異常類型】:{1} <br>【堆棧調用】:{2}</span><span style="color: #800000;">"</span><span style="color: #000000;">,
</span><span style="color: #0000ff;">new</span> <span style="color: #0000ff;">object</span><span style="color: #000000;">[] { throwMsg, ex.GetType().Name, ex.StackTrace });
errorMsg </span>= errorMsg.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;"><br></span><span style="color: #800000;">"</span><span style="color: #000000;">);
errorMsg </span>= errorMsg.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">位置</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;"><strong style=\"color:red\">位置</strong></span><span style="color: #800000;">"</span><span style="color: #000000;">);
logger.Error(errorMsg);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> InfoLog(<span style="color: #0000ff;">string</span><span style="color: #000000;"> operateMsg)
{
</span><span style="color: #0000ff;">string</span> errorMsg = <span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">【操作資訊】:{0} <br></span><span style="color: #800000;">"</span><span style="color: #000000;">,
</span><span style="color: #0000ff;">new</span> <span style="color: #0000ff;">object</span><span style="color: #000000;">[] { operateMsg });
errorMsg </span>= errorMsg.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;"><br></span><span style="color: #800000;">"</span><span style="color: #000000;">);
logger.Info(errorMsg);
}
}</span></pre>
5、在上面log4net中的GlobalExceptions類把
LogHelper.ErrorLog(json.Message, context.Exception)替換成如下:NLogHelp.ErrorLog(json.Message,context.Exception)即可。
運作測試如下:
【異常時間】:2018/09/03 14:41:36.786
【異常級别】:ERROR
【異常資訊】:錯誤消息:Failed to create instance of type
at AspectCore.Injector.ServiceCallSiteResolver.ResolvePropertyInject(ServiceDefinition service)
【異常類型】:InvalidOperationException
【堆棧調用】: at AspectCore.Injector.ServiceCallSiteResolver.ResolveTypeService(TypeServiceDefinition typeServiceDefinition)
at AspectCore.Injector.ServiceCallSiteResolver.ResolvePropertyInject(ServiceDefinition service)
at System.Collections.Concurrent.ConcurrentDictionary </span><span style="color: #800080;">2</span>.GetOrAdd(TKey key, Func 2 valueFactory)
at AspectCore.Injector.ServiceResolver.b
自此,完美搞定,等後期我将會介紹采用ELK+NLog進行資料采集及展示,請大家拭目以待吧。
文章轉載自阿裡雲 MVP郭聯钰,
檢視原文