天天看點

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

 整體架構目錄: ASP.NET Core分布式項目實戰-目錄

一、介紹

此篇文章将會介紹項目的全局異常收集以及采用log4net或者NLog記錄。

衆所周知,一旦自己的項目報錯,如果沒有進行處理都是顯示不友好的,有得甚至直接爆出錯誤頁面,看的也是很奇怪。

 為了避免出現這樣的錯誤以及在錯誤出現的時候可以進行收集錯誤,供維護人員進行bug修改,是以需要進行全局異常的收集。

 讓我們開始部署吧。

此篇文章的目錄

1、log4net使用

2、Nlog使用

後期将會把NLog+ELK進行結合部署收集我們的asp.net core的項目。大家可以拭目以待吧。

二、部署(log4net使用)

1、建立一個asp.net core webapi的項目

然後目前我先引入 log4net   nuget包。

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

2、然後建立一個log4net.config檔案

此檔案中,我建立了一個是記錄 錯誤的檔案夾(LogError)以及是記錄操作的檔案夾(LogInfo),代碼如下:我把需要記錄的檔案放在了log檔案夾下面。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <log4net>      
&lt;!-- 錯誤日志類--&gt;
&lt;logger name=<span style="color: #800000;">"</span><span style="color: #800000;">logerror</span><span style="color: #800000;">"</span>&gt;
  &lt;level value=<span style="color: #800000;">"</span><span style="color: #800000;">ALL</span><span style="color: #800000;">"</span> /&gt;
  &lt;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> /&gt;
&lt;/logger&gt;
&lt;!-- 錯誤日志附加媒體--&gt;
&lt;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>&gt;
  &lt;!--日志檔案路徑--&gt;
  &lt;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> /&gt;
  &lt;!--是否是向檔案中追加日志--&gt;
  &lt;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> /&gt;
  &lt;!--log保留天數--&gt;
  &lt;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> /&gt;
  &lt;!--最大檔案大小--&gt;
  &lt;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> /&gt;
  &lt;!--日志檔案名是否是固定不變的--&gt;
  &lt;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> /&gt;
  &lt;!--日志檔案名格式為:<span style="color: #800080;">2008</span>-<span style="color: #800080;">08</span>-<span style="color: #800080;">31</span>.log--&gt;
  &lt;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&amp;quot;.htm&amp;quot;</span><span style="color: #800000;">"</span> /&gt;
  &lt;!--日志根據日期滾動--&gt;
  &lt;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> /&gt;
  &lt;!--資訊日志布局--&gt;
  &lt;layout type=<span style="color: #800000;">"</span><span style="color: #800000;">log4net.Layout.PatternLayout</span><span style="color: #800000;">"</span>&gt;
    &lt;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;">&amp;lt;HR COLOR=red&amp;gt;%n【異常時間】:%d [%t] &amp;lt;BR&amp;gt;%n【異常級别】:%-5p &amp;lt;BR&amp;gt;%n%m &amp;lt;BR&amp;gt;%n &amp;lt;HR Size=1&amp;gt;</span><span style="color: #800000;">"</span>  /&gt;
  &lt;/layout&gt;
&lt;/appender&gt;

&lt;!-- 資訊日志類 --&gt;
&lt;logger name=<span style="color: #800000;">"</span><span style="color: #800000;">loginfo</span><span style="color: #800000;">"</span>&gt;
  &lt;level value=<span style="color: #800000;">"</span><span style="color: #800000;">ALL</span><span style="color: #800000;">"</span> /&gt;
  &lt;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> /&gt;
&lt;/logger&gt;
&lt;!-- 資訊日志附加媒體--&gt;
&lt;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>&gt;
  &lt;!--日志檔案路徑--&gt;
  &lt;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> /&gt;
  &lt;!--是否是向檔案中追加日志--&gt;
  &lt;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> /&gt;
  &lt;!--log保留天數--&gt;
  &lt;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> /&gt;
  &lt;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> /&gt;
  &lt;!--日志檔案名是否是固定不變的--&gt;
  &lt;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> /&gt;
  &lt;!--日志檔案名格式為:<span style="color: #800080;">2008</span>-<span style="color: #800080;">08</span>-<span style="color: #800080;">31</span>.log--&gt;
  &lt;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&amp;quot;.htm&amp;quot;</span><span style="color: #800000;">"</span> /&gt;
  &lt;!--日志根據日期滾動--&gt;
  &lt;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> /&gt;
  &lt;!--資訊日志布局--&gt;
  &lt;layout type=<span style="color: #800000;">"</span><span style="color: #800000;">log4net.Layout.PatternLayout</span><span style="color: #800000;">"</span>&gt;
    &lt;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;">&amp;lt;HR COLOR=blue&amp;gt;%n日志時間:%d [%t] &amp;lt;BR&amp;gt;%n日志級别:%-5p &amp;lt;BR&amp;gt;%n%m &amp;lt;BR&amp;gt;%n &amp;lt;HR Size=1&amp;gt;</span><span style="color: #800000;">"</span>  /&gt;
  &lt;/layout&gt;
&lt;/appender&gt;           

</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>

&lt;handlers&gt;
  &lt;remove name=<span style="color: #800000;">"</span><span style="color: #800000;">aspNetCore</span><span style="color: #800000;">"</span>/&gt;
  &lt;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>/&gt;
&lt;/handlers&gt;
&lt;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> /&gt;           

</system.webServer>

-->

</configuration>

3、在asp.net core項目中 Startup.cs 中需要添加初始化log4net的倉儲名,主要是用來給log4net标記一個名稱,這邊可以随意。

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

4、在項目中建立一個類用來記錄log的日志格式以及資料分類存放

建立LogHelper.cs,

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

定義log格式,當然自己可以随意定義哈。

#region 全局異常錯誤記錄持久化      
<span style="color: #808080;">///</span> <span style="color: #808080;">&lt;summary&gt;</span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> 全局異常錯誤記錄持久化
    </span><span style="color: #808080;">///</span> <span style="color: #808080;">&lt;/summary&gt;</span>
    <span style="color: #808080;">///</span> <span style="color: #808080;">&lt;param name="throwMsg"&gt;&lt;/param&gt;</span>
    <span style="color: #808080;">///</span> <span style="color: #808080;">&lt;param name="ex"&gt;&lt;/param&gt;</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} &lt;br&gt;【異常類型】:{1} &lt;br&gt;【異常資訊】:{2} &lt;br&gt;【堆棧調用】:{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;">&lt;br&gt;</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;">&lt;strong style=\"color:red\"&gt;位置&lt;/strong&gt;</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;">&lt;summary&gt;</span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> 自定義操作記錄,與倉儲中的增删改的日志是記錄同一張表
    </span><span style="color: #808080;">///</span> <span style="color: #808080;">&lt;/summary&gt;</span>
    <span style="color: #808080;">///</span> <span style="color: #808080;">&lt;param name="throwMsg"&gt;&lt;/param&gt;</span>
    <span style="color: #808080;">///</span> <span style="color: #808080;">&lt;param name="ex"&gt;&lt;/param&gt;</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} &lt;br&gt;【異常類型】:{1} &lt;br&gt;【異常資訊】:{2} &lt;br&gt;【堆棧調用】:{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;">&lt;br&gt;</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;">&lt;strong style=\"color:red\"&gt;位置&lt;/strong&gt;</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;">&lt;summary&gt;</span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> 生産環境的消息
    </span><span style="color: #808080;">///</span> <span style="color: #808080;">&lt;/summary&gt;</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;">&lt;summary&gt;</span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> 開發環境的消息
    </span><span style="color: #808080;">///</span> <span style="color: #808080;">&lt;/summary&gt;</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;">&lt;/summary&gt;</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的代碼在日志記錄中就會出現如下的展示:

哇,發現我的錯誤日志的格式非常的清楚,當然這個跟我的做事态度以及性格有很大的關系的啦,畢竟樓主還是很帥的。哈哈哈。

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

三、NLog使用

1、在項目中添加nlog的nuget包引入,“NLog.Web.AspNetCore”

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

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>&gt;           

<!-- the targets to write to -->

<targets>

&lt;!-- 輸出到檔案,這個檔案記錄所有的日志 --&gt;
&lt;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;">&amp;lt;HR COLOR=red&amp;gt;${longdate}&amp;lt;BR&amp;gt;${logger}&amp;lt;BR&amp;gt;${uppercase:${level}}&amp;lt;BR&amp;gt;${message} ${exception}&amp;lt;HR Size=1&amp;gt;</span><span style="color: #800000;">"</span> /&gt;

&lt;!-- 輸出到檔案,這個檔案記錄錯誤日志 --&gt;
&lt;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;">&amp;lt;HR COLOR=red&amp;gt;【異常時間】:${date} &amp;lt;BR&amp;gt;【異常級别】:${level:uppercase=true} &amp;lt;BR&amp;gt;${message}&amp;lt;HR Size=1&amp;gt;</span><span style="color: #800000;">"</span> /&gt;

&lt;!-- 輸出到檔案,這個檔案記錄記錄檔 --&gt;
&lt;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;">&amp;lt;HR COLOR=red&amp;gt;【操作時間】:${date} &amp;lt;BR&amp;gt;【操作級别】:${level:uppercase=true} &amp;lt;BR&amp;gt;${message}&amp;lt;HR Size=1&amp;gt;</span><span style="color: #800000;">"</span> /&gt;           

</targets>

<!-- rules to map from logger name to target -->

<rules>

&lt;!--All logs, including <span style="color: #0000ff;">from</span> Microsoft--&gt;
&lt;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> /&gt;
&lt;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> /&gt;
&lt;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> /&gt;
&lt;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> /&gt;           

</rules>

</nlog>

注:然後将此檔案點選右鍵,選擇屬性,把複制輸出目錄修改為“始終複制”,無法不修改,則會無法加載此檔案。

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

3、在startup.cs中的  Configure方法注入

//ILoggerFactory loggerFactory
loggerFactory.AddNLog();
NLog.LogManager.LoadConfiguration("nlog.config"); //填入上面建立的檔案的名稱      

 然後運作以下即可看到在bin/debug下面生成檔案夾

asp.net core添加全局異常處理及log4net、Nlog應用一、介紹二、部署(log4net使用)三、NLog使用

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} &lt;br&gt;【異常類型】:{1} &lt;br&gt;【堆棧調用】:{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;">&lt;br&gt;</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;">&lt;strong style=\"color:red\"&gt;位置&lt;/strong&gt;</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} &lt;br&gt;</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;">&lt;br&gt;</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郭聯钰,

檢視原文