天天看點

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

目錄

介紹

4個日志記錄庫

log4net

Log4net記錄文本檔案中

Log4net記錄到資料庫中

NLOG

Nlog日志記錄在文本檔案中

NLog日志記錄到資料庫中

Serilog

Serilog記錄到文本檔案中

Serilog記錄到資料庫中

Serilog.Settings.AppSettings    

ELMAH

ELMAH記錄資料庫

在本文中,我們将學習如何為ASP.NET MVC應用程式實作市場上可用的最佳Logging庫。

介紹

什麼是日志記錄?

日志記錄是儲存日志的行為。日志檔案是寫入應用程式的所有事件或錯誤的檔案。

參考: - https://en.wikipedia.org/wiki/Log_file

日志記錄是應用程式的重要部分; 我們嘗試建構多少無錯誤的應用程式,但有些錯誤是有條件地發生的,為了記錄這種錯誤,我們需要使用一些日志庫,例如,由于某些資料庫伺服器關閉或某些應用程式功能不正常,可能會發生一些錯誤,如果我們沒有适當的日志記錄設定,我們将無法知道在用戶端功能上不起作用。開發人員有一個衆所周知的短語“它在我的機器上是正常的”。要知道應用程式日志記錄中出現的問題很重要。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

4個日志記錄庫

我們有4個日志記錄庫,我們将詳細了解如何使用ASP.NET MVC應用程式實作它們。

1. Log4net  (記錄在文本檔案中+記錄在SQL資料庫中)

2. Nlog  (記錄在文本檔案中+記錄在SQL資料庫中)

3. Serilog  (記錄在文本檔案中+記錄在SQL資料庫中)

4. Elmah(記錄在SQL資料庫中)

源代碼可在Github連結上獲得,在本文末尾提供。

建立ASP.NET應用程式

讓我們首先使用名為“ WebErrorLogging ”的4.5 ASP.NET模闆建立一個簡單的ASP.NET Web應用程式。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

在建立應用程式之後,我們将要看到如何實作的第一個庫是Log4net。

log4net

什麼是Apache log4net?

Apache log4net庫是一個幫助程式員将日志語句輸出到各種輸出标的工具。

參考定義:——https://logging.apache.org/log4net/

從NuGet添加項目的引用

我們将從NuGet包安裝log4net。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

在添加了log4net的引用後,我們将配置它以記錄錯誤。

我們将在Log4net中看到兩種記錄方式

  1. 在文本檔案中
  2. 在資料庫中

Log4net記錄文本檔案中

讓我們從日志記錄在文本檔案中開始。為了在Log4net中執行此操作,我們需要在web.config檔案中添加配置。為了在文本檔案中記錄消息,我們将使用“RollingLogFileAppender”類。

RollingLogFileAppender根據大小或日期或兩者來滾動日志檔案。

RollingFileAppender建構在FileAppender之上,并且具有與該appender相同的選項。

在web.config檔案中添加此配置将開始将記錄消息寫入檔案中。

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
 </configSections>

<log4net>
    <root>
      <level value="ALL"></level>
      <appender-ref ref="RollingLogFileAppender"></appender-ref>
    </root>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="E:\DemoProject\WebErrorLogging\WebErrorLogging\ErrorLog\logfile.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern 

        value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
</log4net>
           

您可以在上面的配置設定中看到,這些設定必須添加到web.config檔案的“<configuration>”标記中。

然後在log4net元素中我們可以看到該标簽内的root元素,在root内我們還有2個子元素,一個是level,另一個是appender-ref。

appender-ref:——允許零個或多個元素。允許記錄器按名稱引用appender。

level:——可選元素,最多允許一個元素。定義此記錄器的日志記錄級别。此記錄器僅接受此級别或更進階别的事件。

不同的日志記錄級别

  • ALL
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF

RollingLogFileAppender

如果你可以看到裡面有名稱為“RollingLogFileAppender”的主元素appender,那麼就有一個子元素檔案,我們可以在其中配置日志記錄檔案的路徑。

示例:——

<file value="ErrorLog/log.txt" />
           

注意:——我已将路徑指定為“ErrorLog / log.txt”,因為我在此應用程式中建立了一個ErrorLog檔案夾。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

下一個元素是appendToFile。

appendToFile

如果該值設定為false,則将覆寫該檔案,如果将其設定為true,則将附加該檔案。

RollingStyle

名稱 描述
Once 每個程式執行一次滾動檔案
Size 僅根據檔案大小滾動檔案
Date 僅根據日期滾動檔案
Composite 根據檔案的大小和日期滾動檔案

參考來自:—— https://logging.apache.org/

maxSizeRollBackups

如果我們将最大檔案大小設定為1MB并将maxSizeRollBackups設定為10 MB,那麼根據日期或檔案大小,它将隻保留最後10MB的檔案。

web.config檔案的快照

我在下面給出了快照,以供參考,在web.config檔案中正确添加元素。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

在web.config檔案中添加配置後,我們将初始化Log4net。

 初始化Log4net

我們需要調用XmlConfigurator類的configure方法來初始化Log4net。

log4net.Config.XmlConfigurator.Configure();
           
ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

在global.asax中初始化XmlConfigurator方法之後。現在可以示範了,我在此添加了一個名為DefaultController的控制器,其中包含Index操作方法,以顯示我們如何記錄錯誤,使用它來調試資訊。

代碼片段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using log4net;

namespace WebErrorLogging.Controllers
{
    public class DefaultController : Controller
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof(DefaultController));

        // GET: Default

        public ActionResult Index()
        {
            try
            {
                Log.Debug("Hi I am log4net Debug Level");
                Log.Info("Hi I am log4net Info Level");
                Log.Warn("Hi I am log4net Warn Level");
                throw new NullReferenceException();
                return View();
            }
            catch (Exception ex)
            {
                Log.Error("Hi I am log4net Error Level", ex);
                Log.Fatal("Hi I am log4net Fatal Level", ex);
                throw;
            }
        }
    }
}
           

添加控制器并擷取LogManager類的執行個體後,我們在各個級别上記錄了消息。      

現在讓我們通過運作應用程式來測試它。

錯誤日志記錄的檔案

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

現在我們已經完成了将應用程式記錄到文本檔案中,然後我們将異常記錄到資料庫中。

Log4net記錄到資料庫中

要記錄到資料庫中,我們需要先在資料庫中建立一個表。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

用于建立表的腳本

CREATE TABLE [dbo].[Log](
       [Id] [int] IDENTITY(1,1) NOT NULL,
       [Date] [datetime] NOT NULL,
       [Thread] [varchar](255) NOT NULL,
       [Level] [varchar](50) NOT NULL,
       [Logger] [varchar](255) NOT NULL,
       [Message] [varchar](4000) NOT NULL,
       [Exception] [varchar](2000) NULL
) ON [PRIMARY]
           

在資料庫中建立Log表後,我們将添加新類型的appender,即“log4net.Appender.AdoNetAppender”

在web.config檔案中添加此配置将開始将日志消息寫入Database表。

為此,我們需要資料庫的連接配接字元串,我們将記錄錯誤,如果您看到下面的配置,您将看到connectionStrings元素,其中我添加了資料庫連接配接設定,我們将在“AdoNetAppender”中配置設定connectionStrings 。

如果在“AdoNetAppender”中看到commandText元素,您将在其中看到insert語句的腳本。

我們需要設定的主要内容是“appender-ref”,這裡我們要将消息記錄到資料庫中,以便我們将參考(ref)設定為“AdoNetAppender”。

<appender-ref ref="AdoNetAppender"></appender-ref>
           

配置設定

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <connectionStrings>
    <add name="ConnectionStringLogging" 

    connectionString="data source=SAI-PC\SQLEXPRESS;
    initial catalog=LoggingDatabase;
    integrated security=false;persist security info=True;User ID=sa;Password=Pass$123" 

    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <log4net>
    <root>
      <level value="ALL"></level>
      <appender-ref ref="AdoNetAppender"></appender-ref>
    </root>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType 

      value="System.Data.SqlClient.SqlConnection,System.Data, 
      Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionStringName value="ConnectionStringLogging" />
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) 
      VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>
  </log4net>
</configuration>
           

web.config檔案的快照

我在下面給出了快照,以供參考,在web.config檔案中正确添加元素。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

現在我們将運作我們用于在文本檔案中記錄消息的相同應用程式,但這次我們要将消息記錄到資料庫中。

現在讓我們通過運作應用程式來測試它。

錯誤記錄到資料庫中

運作應用程式并通路預設控制器後,消息将記錄在資料庫中,如下所示。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

在完成了解Log4net之後,接下來我們将繼續讨論如何使用Nlog來記錄消息。

NLOG

什麼是Nlog?

NLog是一個靈活的免費日志記錄平台,适用于各種.NET平台,包括.NET standard。NLog可以輕松寫入多個目标(資料庫,檔案,控制台)并即時更改日志記錄配置。

參考來自:—— https://nlog-project.org/

從NuGet添加項目的引用

我們将從NuGet包安裝2個包NLog和NLog.Config。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

添加NLog的引用後,接下來我們将配置它以記錄錯誤。

我們将看到在NLog中有2種日志記錄的方法

  1. 在文本檔案中
  2. 在資料庫中 

Nlog日志記錄在文本檔案中

級别 典型用途
Fatal 發生了一件壞事; 應用程式即将關閉
Error 有些事情失敗了; 應用程式可能會也可能不會繼續工作
Warn 出乎意料的事; 應用程式将繼續工作
Info 正常行為如郵件發送給使用者,更新配置檔案等
Debug 用于調試; 執行查詢,使用者通過身份驗證,會話已過期
Trace 用于跟蹤調試; 開始方法X,結束方法X.

參考自:https://github.com/NLog/NLog/wiki/Configuration-file#log-levels

讓我們從在文本檔案中的日志記錄開始。為了在NLog中執行此操作,我們需要在web.config檔案中添加配置以便在文本檔案中寫入。

代碼片段

<configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
  </configSections>

  <nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
      <target name="logfile" xsi:type="File"

              maxArchiveFiles="10"

              archiveAboveSize="5242880"

              archiveEvery="Minute"

              archiveNumbering="Sequence"

              fileName="${basedir}/ErrorLog/logfile.txt"

              layout="------${level}(${longdate})${machinename}------${newline}
                      Exception Type:${exception:format=Type} |
                      Exception Message:${exception:format=Message} |
                      Stack Trace:${exception:format=Stack Trace} |
                      Additional Info:${message}${newline}" />
    </targets>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="logfile" />
    </rules>
  </nlog>
           

您可以根據需要設定許多選項,您可以根據檔案的時間大小存檔日志。對于這個例子,我是根據時間和大小來完成的, 因為我已經通過了archiveEvery =“Minute”,對于大小,我提供了archiveAboveSize =“5242880”,大小是以位元組5MB =“5,242,880”為機關。

連結:——https://github.com/nlog/NLog/wiki/File-target

web.config檔案的快照

我在下面給出了快照,以供參考,在web.config檔案中正确添加元素。

​​​​​​

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

在配置NLog後,接下來我們将在其中添加帶有Index操作方法的DefaultController,其接下來用于日志記錄,我們将使用LogManager類建立Logger執行個體。

代碼片段

public class DefaultController : Controller
    {
        public readonly Logger Logger = NLog.LogManager.GetCurrentClassLogger();
        // GET: Default
        public ActionResult Index()
        {
            try
            {
                Logger.Debug("Hi I am NLog Debug Level");
                Logger.Info("Hi I am NLog Info Level");
                Logger.Warn("Hi I am NLog Warn Level");
                throw new NullReferenceException();
                return View();
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Hi I am NLog Error Level");
                Logger.Fatal(ex, "Hi I am NLog Fatal Level");
                throw;
            }
        }
    }
           

在建立Logger執行個體後,我們将調用各種日志記錄級别方法來記錄消息。

現在讓我們通過運作應用程式來測試它。

錯誤記錄的檔案

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

現在我們已經完成了在文本檔案中記錄消息,接下來在配置檔案中進行了一些更改,我們将以簡單的步驟将日志記錄消息發送到資料庫中

NLog日志記錄到資料庫中

要把日志記錄到資料庫中,我們需要先在資料庫中建立一個表。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

用于建立表的腳本

CREATE TABLE [dbo].[NLog](
    [id] [int] IDENTITY(1,1) NOT NULL Primary key,
    [timestamp] [datetime] NOT NULL,
    [level] [varchar](100) NOT NULL,
    [logger] [varchar](1000) NOT NULL,
    [message] [varchar](3600) NOT NULL,
    [Callsite] [varchar](3600) NULL,
    [exception] [varchar](3600) NULL
)
           

完成建立NLog表後,接下來我們将添加配置設定到現有web.config檔案以記錄到資料庫中。

我們隻需要在現有的NLog配置中添加一個具有新名稱的新目标。這個目标包含資料庫的連接配接字元串以及SQL插入查詢以插入資料庫,下一步,我們需要傳遞包含要與之一起記錄的資料的參數,我們需要在rules元素中使用日志級别(“trace”)注冊目标(“database”)。     

用于記錄資料庫的配置設定

<target name="database" type="Database" 

connectionString="data source=SAI-PC\SQLEXPRESS;
initial catalog=LoggingDatabase;
integrated security=false;
persist security info=True;
User ID=sa;Password=Pass$123">
        <commandText> insert into NLog ([TimeStamp],[Level],Logger, [Message], Callsite, Exception) 
        values (@TimeStamp, @Level, @Logger, @Message, @Callsite, @Exception); </commandText>
        <parameter name="@TimeStamp" layout="${date}" />
        <parameter name="@Level" layout="${level}" />
        <parameter name="@Logger" layout="${logger}" />
        <parameter name="@Message" layout="${message}" />
        <parameter name="@Callsite" layout="${callsite}" />
        <parameter name="@Exception" layout="${exception:tostring}" />
        <dbProvider>System.Data.SqlClient</dbProvider>
      </target>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="database" />
    </rules>
           

注意: - * - 比對0個或更多字元。

添加新目标以記錄資料庫中的消息後,web.config檔案的快照

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

現在讓我們通過運作應用程式來測試它。

錯誤記錄到資料庫中

運作應用程式并通路預設控制器後,消息将記錄在資料庫中,如下所示。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

在完全了解Nlog後,接下來我們将繼續前進,将看看如何使用Serilog Log記錄消息。

Serilog

什麼是Serilog?

Serilog是.NET應用程式的診斷日志記錄庫。它易于設定,具有幹淨的API,并可在所有最新的.NET平台上運作。雖然它在最簡單的應用程式中也很有用,但Serilog對結構化日志記錄的支援在檢測複雜、分布式和異步應用程式和系統時尤為突出。

我們将在Serilog中看到兩種記錄的方法

  1. 在文本檔案中
  2. 在資料庫中 

從NuGet添加項目的引用

我們将從NuGet包安裝2個軟體包“Serilog”和“Serilog.Sinks.File”。

Serilog:——Serilog是.NET應用程式的日志記錄庫。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

Serilog.Sinks.File:——此包用于将日志記錄消息寫入文本檔案。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

添加兩個包之後,接下來我們将檢視日志事件級别。

記錄事件級别

Serilog使用級别作為配置設定日志事件重要性的主要手段。重要性遞增的級别為:

接下來,我編寫了一個幫助類,其中我編寫了代碼來集中事件日志記錄。

名稱 描述
Verbose 跟蹤資訊和調試細節; 通常,僅在異常情況下開啟
Debug 内部控制流程和診斷狀态轉儲,以便于查明已識别的問題
Information 感興趣的事件或與外部觀察員有關的事件; 預設啟用的最低日志記錄級别
Warning 可能的問題或服務/功能退化的名額
Error 表示應用程式或連接配接系統中的故障
Fatal 導緻應用程式完全失敗的嚴重錯誤

參考連結:——https://github.com/serilog/serilog/wiki/Writing-Log-Events

Serilog記錄到文本檔案中

讓我們開始了解代碼。我建立了一個名為helper的靜态類,這樣就可以在不建立對象的情況下使用它。下一個案例是僅初始化此類一次,這就是為什麼我必須使用靜态構造函數來初始化它。對于在文本檔案中的日志記錄,我們已經建立了LoggerConfiguration類的執行個體,并且對于日志記錄錯誤,我已經将最低級别設定為錯誤,我們要寫文本檔案,但在我們要存儲它的地方,它将在檔案夾右側,為了保持整潔以維護錯誤,我已經在該檔案夾中建立了一個主檔案夾“ ErrorLog ”,我必須根據 “調試,錯誤,警告...” 級别建立子檔案夾。現在我們需要将消息寫入此檔案夾,這樣我們就需要為它設定路徑,我們将使用“ WriteTo.File“方法,并以字元串形式将路徑傳遞給它。接下來,我們不能将錯誤消息記錄為單個大文本檔案,因為我不會幫助我們輕松跟蹤消息記錄。另一個原因是,如果檔案大小變大,則無法輕松打開該檔案以克服這種情況,我們可以使用“rollingInterval”和“rollOnFileSizeLimit”屬性,在rollingInterval中,我們可以使用“RollingInterval”參數(無限,年,月,日,小時,分鐘)滾動檔案,在“rollOnFileSizeLimit”中,我們可以設定檔案大小限制。為此,我們需要以位元組為機關設定屬性“fileSizeLimitBytes”并将rollOnFileSizeLimit設定為true。現在,在建立執行個體後,我根據不同的級别建立了不同的方法,以便我們可以根據需要使用不同的方法。 

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

Helper類的代碼片段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Serilog;
using Serilog.Events;

namespace WebErrorLogging.Utilities
{
    public static class Helper
    {
        private static readonly ILogger Errorlog;
        private static readonly ILogger Warninglog;
        private static readonly ILogger Debuglog;
        private static readonly ILogger Verboselog;
        private static readonly ILogger Fatallog;

        static Helper()
        {

            // 5 MB = 5242880 bytes

            Errorlog = new LoggerConfiguration()
                .MinimumLevel.Error()
               .WriteTo.File(System.Web.Hosting.HostingEnvironment.MapPath("~/ErrorLog/Error/log.txt"),
                rollingInterval: RollingInterval.Day,
                fileSizeLimitBytes: 5242880,
                rollOnFileSizeLimit: true)
                .CreateLogger();

            Warninglog = new LoggerConfiguration()
                .MinimumLevel.Warning()
              .WriteTo.File(System.Web.Hosting.HostingEnvironment.MapPath("~/ErrorLog/Warning/log.txt"),
                    rollingInterval: RollingInterval.Day,
                    fileSizeLimitBytes: 5242880,
                    rollOnFileSizeLimit: true)
                .CreateLogger();

            Debuglog = new LoggerConfiguration()
                .MinimumLevel.Debug()
              .WriteTo.File(System.Web.Hosting.HostingEnvironment.MapPath("~/ErrorLog/Debug/log.txt"),
                    rollingInterval: RollingInterval.Day,
                    fileSizeLimitBytes: 5242880,
                    rollOnFileSizeLimit: true)
                .CreateLogger();

            Verboselog = new LoggerConfiguration()
                .MinimumLevel.Verbose()
              .WriteTo.File(System.Web.Hosting.HostingEnvironment.MapPath("~/ErrorLog/Verbose/log.txt"),
                    rollingInterval: RollingInterval.Day,
                    fileSizeLimitBytes: 5242880,
                    rollOnFileSizeLimit: true)
                .CreateLogger();

            Fatallog = new LoggerConfiguration()
                .MinimumLevel.Fatal()
              .WriteTo.File(System.Web.Hosting.HostingEnvironment.MapPath("~/ErrorLog/Fatal/log.txt"),
                    rollingInterval: RollingInterval.Day,
                    fileSizeLimitBytes: 5242880,
                    rollOnFileSizeLimit: true)
                .CreateLogger();

        }

        public static void WriteError(Exception ex, string message)
        {
            //Error - indicating a failure within the application or connected system
            Errorlog.Write(LogEventLevel.Error, ex, message);
        }

        public static void WriteWarning(Exception ex, string message)
        {
            //Warning - indicators of possible issues or service / functionality degradation
            Warninglog.Write(LogEventLevel.Warning, ex, message);
        }

        public static void WriteDebug(Exception ex, string message)
        {
            //Debug - internal control flow and diagnostic state dumps to facilitate 
            //          pinpointing of recognised problems
            Debuglog.Write(LogEventLevel.Debug, ex, message);
        }

        public static void WriteVerbose(Exception ex, string message)
        {
            // Verbose - tracing information and debugging minutiae; 
            //             generally only switched on in unusual situations
            Verboselog.Write(LogEventLevel.Verbose, ex, message);
        }

        public static void WriteFatal(Exception ex, string message)
        {
            //Fatal - critical errors causing complete failure of the application
            Fatallog.Write(LogEventLevel.Fatal, ex, message);
        }

        public static void WriteInformation(Exception ex, string message)
        {
            //Fatal - critical errors causing complete failure of the application
            Fatallog.Write(LogEventLevel.Fatal, ex, message);
        }

    }
}
           

在建立一個helper之後,接下來我們将在DefaultController的Index操作方法中調用這個helper類來測試和記錄所有類型的消息。

DefaultController的代碼片段 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebErrorLogging.Utilities;

namespace WebErrorLogging.Controllers
{
    public class DefaultController : Controller
    {

        // GET: Default
        public ActionResult Index()
        {
            try
            {
                Helper.WriteDebug(null, "Debug ");
                Helper.WriteWarning(null, "Warning ");
                throw new NotImplementedException();
            }
            catch (Exception e)
            {
                Helper.WriteError(e, "Error");
                Helper.WriteFatal(e, "Fatal");
                Helper.WriteVerbose(e, "Verbose");
                throw;
            }

            return View();
        }
    }
}
           

在預設控制器中将Helper類添加到日志記錄消息之後,我們将儲存應用程式并對其進行測試。

最後輸出

使用Serilog在文本檔案中記錄消息後的最終輸出。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

使用Serilog在文本檔案中完成日志消息之後,接下來我們将學習如何使用相同的Serilog将消息記錄到SQL資料庫中,但是使用另一個額外的NuGet包。

Serilog記錄到資料庫中

在這一部分中,我們将消息記錄到SQL資料庫中,以便我們将新的NuGet包“ Serilog.Sinks.MSSqlServer ”添加到現有解決方案中。

從NuGet添加項目的引用

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

安裝NuGet包之後,現在我們将編寫一個類似的幫助類,就像我們在文本檔案中記錄消息一樣,但這次我們将在資料庫中記錄消息。

為此,我們首先要建立一個表。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

用于建立表的腳本 

CREATE TABLE [dbo].[Serilogs](
    [Id] [int] IDENTITY(1,1) NOT NULL Primary Key,
    [Message] [nvarchar](max) NULL,
    [MessageTemplate] [nvarchar](max) NULL,
    [Level] [nvarchar](128) NULL,
    [TimeStamp] [datetime] NULL,
    [Exception] [nvarchar](max) NULL,
    [Properties] [xml] NULL)
           

在建立表之後,我們将編寫一個幫助程式類“HelperStoreSqlLog”,它将集中記錄并在Serilogs表中存儲消息。

在資料庫中設定日志記錄時,需要關注3個要點。

  1. 在web.config檔案中檢查資料庫的正确連接配接字元串
  2. 在資料庫中建立Serilogs表。
  3. 要使用WriteTo.MSSqlServer方法在資料庫中寫入消息和錯誤,此方法需要2個參數作為輸入,一個是連接配接字元串,另一個是您的表。

代碼片段

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using Serilog;
using Serilog.Events;

namespace WebErrorLogging.Utilities
{
    public static class HelperStoreSqlLog
    {
        private static readonly ILogger Errorlog;
        private static readonly ILogger Warninglog;
        private static readonly ILogger Debuglog;
        private static readonly ILogger Verboselog;
        private static readonly ILogger Fatallog;
        private static readonly string ConnectionString = 
         ConfigurationManager.ConnectionStrings["ConnectionStringLogging"].ToString();

        static HelperStoreSqlLog()
        {

            Errorlog = new LoggerConfiguration()
                .MinimumLevel.Error()
                .WriteTo.MSSqlServer(ConnectionString, "Serilogs")
                .CreateLogger();

            Warninglog = new LoggerConfiguration()
                .MinimumLevel.Warning()
                .WriteTo.MSSqlServer(ConnectionString, "Serilogs")
                .CreateLogger();

            Debuglog = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.MSSqlServer(ConnectionString, "Serilogs")
                .CreateLogger();

            Verboselog = new LoggerConfiguration()
                .MinimumLevel.Verbose()
                .WriteTo.MSSqlServer(ConnectionString, "Serilogs")
                .CreateLogger();

            Fatallog = new LoggerConfiguration()
                .MinimumLevel.Fatal()
                .WriteTo.MSSqlServer(ConnectionString, "Serilogs")
                .CreateLogger();

        }

        public static void WriteError(Exception ex, string message)
        {
            //Error - indicating a failure within the application or connected system
            Errorlog.Write(LogEventLevel.Error, ex, message);
        }

        public static void WriteWarning(Exception ex, string message)
        {
            //Warning - indicators of possible issues or service / functionality degradation
            Warninglog.Write(LogEventLevel.Warning, ex, message);
        }

        public static void WriteDebug(Exception ex, string message)
        {
            //Debug - internal control flow and diagnostic 
            // state dumps to facilitate pinpointing of recognised problems
            Debuglog.Write(LogEventLevel.Debug, ex, message);
        }

        public static void WriteVerbose(Exception ex, string message)
        {
            // Verbose - tracing information and debugging minutiae; 
            //   generally only switched on in unusual situations
            Verboselog.Write(LogEventLevel.Verbose, ex, message);
        }

        public static void WriteFatal(Exception ex, string message)
        {
            //Fatal - critical errors causing complete failure of the application
            Fatallog.Write(LogEventLevel.Fatal, ex, message);
        }

        public static void WriteInformation(Exception ex, string message)
        {
            //Fatal - critical errors causing complete failure of the application
            Fatallog.Write(LogEventLevel.Fatal, ex, message);
        }
    }
}
           

在建立HelperStoreSqlLog之後,接下來我們将在DefaultController的Index操作方法中調用此HelperStoreSqlLog類來測試和記錄所有類型的消息。

代碼片段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebErrorLogging.Utilities;

namespace WebErrorLogging.Controllers
{
    public class DefaultController : Controller
    {
        // GET: Default   
        public ActionResult Index()
        {
            try
            {
                HelperStoreSqlLog.WriteDebug(null, "Debug ");
                HelperStoreSqlLog.WriteWarning(null, "Warning ");
                throw new NotImplementedException();
            }
            catch (Exception e)
            {
                HelperStoreSqlLog.WriteError(e, "Error");
                HelperStoreSqlLog.WriteFatal(e, "Fatal");
                HelperStoreSqlLog.WriteVerbose(e, "Verbose");
                throw;
            }
            return View();
        }
    }
}
           

在預設控制器中将HelperStoreSqlLog類添加到日志消息後,我們将儲存應用程式并對其進行測試。

 最後輸出

使用Serilog在資料庫中記錄消息後的最終輸出。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

我們已經使用Serilog完成了日志消息,接下來我們将看到一些配置,我們可以使用Serilog中的appsettings來完成。

Serilog.Settings.AppSettings    

到目前為止,我們已經完全使用代碼配置了Serilog,現在我們将使用appsettings在文本檔案中執行相同的日志消息配置。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

安裝軟體包之後,接下來我們将在appsettings中進行配置設定。

使用“Serilog.Settings.AppSettings”在文本檔案中記錄消息的Appsettings 

<appSettings>

    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

    <!-- appSettings for Serilog Storing in Text file  -->
    <add key="serilog:minimum-level" value="Verbose" />
    <add key="serilog:using:File" value="Serilog.Sinks.File" />
    <add key="serilog:write-to:File.path" 

         value="E:\DemoProject\WebErrorLogging\WebErrorLogging\ErrorLog\Error\log.txt" />
    <add key="serilog:write-to:File.fileSizeLimitBytes" value="1234567" />
    <add key="serilog:write-to:RollingFile.retainedFileCountLimit" value="10" />
    <add key="serilog:write-to:File.rollingInterval" value="Day"/>
    <!-- appSettings for Serilog Storing in Text file  -->

  </appSettings>
           

在appsettings中進行配置後,接下來我們将對代碼進行一些更改,使其适用于此配置。

代碼片段

代碼中配置的主要部分是使用“.ReadFrom.AppSettings()”方法從我們配置的appsetting中讀取配置。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Serilog;
using WebErrorLogging.Utilities;

namespace WebErrorLogging.Controllers
{
    public class DefaultController : Controller
    {
        private ILogger _errorlog;
        public ActionResult Index()
        {
            try
            {
                throw new NotImplementedException();
            }
            catch (Exception e)
            {
                _errorlog = new LoggerConfiguration()
                    .ReadFrom.AppSettings()
                    .CreateLogger();

                _errorlog.Error(e, "DefaultController");
                throw;
            }
            return View();
        }
    }
}
           

添加Serilog.Settings.AppSettings後,接下來我們将儲存應用程式并對其進行測試。

 最後輸出

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH
ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

最後,我們使用serilog完成了日志消息,接下來我們将要看看最後一個最好的日志記錄選項是ELMAH。

ELMAH

什麼是ELMAH?

錯誤日志記錄子產品和處理程式(ELMAH)。

  • 記錄幾乎所有未處理的異常。
  • 用于遠端檢視記錄的異常的整個日志的網頁。
  • 用于遠端檢視任何一個已記錄異常的完整詳細資訊的網頁,包括彩色堆棧跟蹤。
  • 在許多情況下,您可以檢視ASP.NET為給定異常生成的原始黃色死亡螢幕,即使關閉了自定義錯誤模式也是如此。
  • 每個錯誤發生時的電子郵件通知。
  • 來自日志的最後15個錯誤的RSS提要。

參考來自:——https://code.google.com/archive/p/elmah/

我們将看到在Elmah中日志記錄的一種方式

  1. 在資料庫中

在這部分中,我們将使用ELMAH将錯誤記錄到資料庫中。首先,我們需要從NuGet包中安裝2個ELMAH包。

ELMAH記錄資料庫

從NuGet添加項目的引用

1. Elmah.MVC

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

2. elmah.sqlserver

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

安裝elmah.sqlserver包時,它建立“App_Readme”檔案夾,在該檔案夾中,它添加了SQL查詢腳本,用于建立Elmah的表和存儲過程。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

以類似的方式,在安裝elmah和elmah.sqlserver包時,它将XML配置添加到該配置檔案中的web.config檔案中,您将在此處看到“elmah-sqlserver”标記添加到連接配接字元串部分中,您需要提供資料庫連接配接設定。

安裝elmah.sqlserver包後添加的elmah-sqlserver标記片段。

<connectionStrings>
  <!-- TODO: Replace the ****'s with the correct entries -->
  <add name="elmah-sqlserver"
       connectionString="Data Source=****;User ID=****;Password=****;Initial Catalog=****;"
       providerName="System.Data.SqlClient" />
</connectionStrings>
           

用正确的資料庫憑據替換“****”以連接配接到資料庫。

<connectionStrings>
    <!-- TODO: Replace the ****'s with the correct entries -->
    <add name="elmah-sqlserver" 

         connectionString="Data Source=SAI-PC\SQLEXPRESS;User ID=sa;Password=Pass$123;
         Initial Catalog=LoggingDatabase;" 

         providerName="System.Data.SqlClient" />
  </connectionStrings>
           

設定連接配接字元串後,接下來你需要在資料庫中執行Elmah.Sqlserver腳本,以生成Elmah的表和存儲過程。

下面是執行Elmah SqlServer 腳本後的快照

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

現在我們已經配置了ELMAH,讓我們建立一個帶有Index操作方法的預設控制器,這會抛出一個錯誤。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebErrorLogging.Controllers
{
    public class DefaultController : Controller
    {
        public ActionResult Index()
        {
            try
            {
                throw new NotImplementedException();
            }
            catch (Exception)
            {
                throw;
            }
            return View();
        }
    }
}
           

添加Controller和Index操作之後,接下來我們将儲存應用程式并對其進行測試。

輸出

使用ELMAH在資料庫中記錄錯誤後的最終輸出。

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

現在我們在浏覽器上存儲錯誤檢視錯誤,我們需要在web.config檔案中進行配置,如下所示。

1.在web.config中的<system.web>元素下添加的片段

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

片段

<!--Newly Added-->  
    <httpHandlers>  
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />  
    </httpHandlers>  
<!--Newly Added-->
           

2.要在web.config中的<system.webServer>元素下添加的代碼段

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

片段

<!--Newly Added-->
<handlers>
  <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd"
       type="Elmah.ErrorLogPageFactory, Elmah" />
</handlers>
<!--Newly Added-->
           

3.要添加到web.config中的 <elmah>元素中的代碼段 

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

片段

<elmah>
  <security allowRemoteAccess="0" />
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" />
</elmah>
           

什麼是allowRemoteAccess?

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

預設情況下,不允許遠端通路/elmah.axd,這意味着請求除了localhost之外的其他所有URL,傳回HTTP狀态代碼403。不建議打開遠端通路ELMAH UI,但是在某些情況下,它可能是有道理的。将allowRemoteAccess設定為1或true,可以在面向公衆的網站上通路/elmah.axd。

參考自:——https://blog.elmah.io/elmah-security-and-allowremoteaccess-explained/

現在要檢視網頁上的錯誤,您需要在URL http://localhost:55946/elmah.axd的末尾輸入“elmah.axd”,  如下所示。

如果您已在IIS中托管您的站點,則需要輸入URL,例如  http://xyz.com/elmah.axd

最後輸出

ASP.NET MVC的最佳日志記錄庫介紹4個日志記錄庫log4netNLOGSerilogELMAH

最後,我們學習了如何使用最适合以簡單方式記錄ASP.NET MVC應用程式的所有4個記錄器。這些記錄器已被許多公司用于真是生成應用中。

源代碼Log4Net的連結:——https://github.com/saineshwar/WebErrorLogging_Log4Net

源代碼NLog的連結:——https://github.com/saineshwar/WebErrorLogging_NLog

源代碼Serilog的連結:——https://github.com/saineshwar/WebErrorLogging_Serilog

源代碼連結ELMAH:——https://github.com/saineshwar/WebErrorLogging_ELMAH

原文位址:https://www.codeproject.com/Articles/1278018/Best-Logging-libraries-for-ASP-NET-MVC

繼續閱讀