目錄
介紹
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
日志記錄是應用程式的重要部分; 我們嘗試建構多少無錯誤的應用程式,但有些錯誤是有條件地發生的,為了記錄這種錯誤,我們需要使用一些日志庫,例如,由于某些資料庫伺服器關閉或某些應用程式功能不正常,可能會發生一些錯誤,如果我們沒有适當的日志記錄設定,我們将無法知道在用戶端功能上不起作用。開發人員有一個衆所周知的短語“它在我的機器上是正常的”。要知道應用程式日志記錄中出現的問題很重要。
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應用程式。
在建立應用程式之後,我們将要看到如何實作的第一個庫是Log4net。
log4net
什麼是Apache log4net?
Apache log4net庫是一個幫助程式員将日志語句輸出到各種輸出标的工具。
參考定義:——https://logging.apache.org/log4net/
從NuGet添加項目的引用
我們将從NuGet包安裝log4net。
在添加了log4net的引用後,我們将配置它以記錄錯誤。
我們将在Log4net中看到兩種記錄方式
- 在文本檔案中
- 在資料庫中
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檔案夾。
下一個元素是appendToFile。
appendToFile
如果該值設定為false,則将覆寫該檔案,如果将其設定為true,則将附加該檔案。
RollingStyle
名稱 | 描述 |
Once | 每個程式執行一次滾動檔案 |
Size | 僅根據檔案大小滾動檔案 |
Date | 僅根據日期滾動檔案 |
Composite | 根據檔案的大小和日期滾動檔案 |
參考來自:—— https://logging.apache.org/
maxSizeRollBackups
如果我們将最大檔案大小設定為1MB并将maxSizeRollBackups設定為10 MB,那麼根據日期或檔案大小,它将隻保留最後10MB的檔案。
web.config檔案的快照
我在下面給出了快照,以供參考,在web.config檔案中正确添加元素。
在web.config檔案中添加配置後,我們将初始化Log4net。
初始化Log4net
我們需要調用XmlConfigurator類的configure方法來初始化Log4net。
log4net.Config.XmlConfigurator.Configure();
在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類的執行個體後,我們在各個級别上記錄了消息。
現在讓我們通過運作應用程式來測試它。
錯誤日志記錄的檔案
現在我們已經完成了将應用程式記錄到文本檔案中,然後我們将異常記錄到資料庫中。
Log4net記錄到資料庫中
要記錄到資料庫中,我們需要先在資料庫中建立一個表。
用于建立表的腳本
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檔案中正确添加元素。
現在我們将運作我們用于在文本檔案中記錄消息的相同應用程式,但這次我們要将消息記錄到資料庫中。
現在讓我們通過運作應用程式來測試它。
錯誤記錄到資料庫中
運作應用程式并通路預設控制器後,消息将記錄在資料庫中,如下所示。
在完成了解Log4net之後,接下來我們将繼續讨論如何使用Nlog來記錄消息。
NLOG
什麼是Nlog?
NLog是一個靈活的免費日志記錄平台,适用于各種.NET平台,包括.NET standard。NLog可以輕松寫入多個目标(資料庫,檔案,控制台)并即時更改日志記錄配置。
參考來自:—— https://nlog-project.org/
從NuGet添加項目的引用
我們将從NuGet包安裝2個包NLog和NLog.Config。
添加NLog的引用後,接下來我們将配置它以記錄錯誤。
我們将看到在NLog中有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檔案中正确添加元素。
在配置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執行個體後,我們将調用各種日志記錄級别方法來記錄消息。
現在讓我們通過運作應用程式來測試它。
錯誤記錄的檔案
現在我們已經完成了在文本檔案中記錄消息,接下來在配置檔案中進行了一些更改,我們将以簡單的步驟将日志記錄消息發送到資料庫中
NLog日志記錄到資料庫中
要把日志記錄到資料庫中,我們需要先在資料庫中建立一個表。
用于建立表的腳本
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檔案的快照
現在讓我們通過運作應用程式來測試它。
錯誤記錄到資料庫中
運作應用程式并通路預設控制器後,消息将記錄在資料庫中,如下所示。
在完全了解Nlog後,接下來我們将繼續前進,将看看如何使用Serilog Log記錄消息。
Serilog
什麼是Serilog?
Serilog是.NET應用程式的診斷日志記錄庫。它易于設定,具有幹淨的API,并可在所有最新的.NET平台上運作。雖然它在最簡單的應用程式中也很有用,但Serilog對結構化日志記錄的支援在檢測複雜、分布式和異步應用程式和系統時尤為突出。
我們将在Serilog中看到兩種記錄的方法
- 在文本檔案中
- 在資料庫中
從NuGet添加項目的引用
我們将從NuGet包安裝2個軟體包“Serilog”和“Serilog.Sinks.File”。
Serilog:——Serilog是.NET應用程式的日志記錄庫。
Serilog.Sinks.File:——此包用于将日志記錄消息寫入文本檔案。
添加兩個包之後,接下來我們将檢視日志事件級别。
記錄事件級别
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。現在,在建立執行個體後,我根據不同的級别建立了不同的方法,以便我們可以根據需要使用不同的方法。
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在文本檔案中記錄消息後的最終輸出。
使用Serilog在文本檔案中完成日志消息之後,接下來我們将學習如何使用相同的Serilog将消息記錄到SQL資料庫中,但是使用另一個額外的NuGet包。
Serilog記錄到資料庫中
在這一部分中,我們将消息記錄到SQL資料庫中,以便我們将新的NuGet包“ Serilog.Sinks.MSSqlServer ”添加到現有解決方案中。
從NuGet添加項目的引用
安裝NuGet包之後,現在我們将編寫一個類似的幫助類,就像我們在文本檔案中記錄消息一樣,但這次我們将在資料庫中記錄消息。
為此,我們首先要建立一個表。
用于建立表的腳本
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個要點。
- 在web.config檔案中檢查資料庫的正确連接配接字元串
- 在資料庫中建立Serilogs表。
- 要使用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在資料庫中記錄消息後的最終輸出。
我們已經使用Serilog完成了日志消息,接下來我們将看到一些配置,我們可以使用Serilog中的appsettings來完成。
Serilog.Settings.AppSettings
到目前為止,我們已經完全使用代碼配置了Serilog,現在我們将使用appsettings在文本檔案中執行相同的日志消息配置。
安裝軟體包之後,接下來我們将在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後,接下來我們将儲存應用程式并對其進行測試。
最後輸出
最後,我們使用serilog完成了日志消息,接下來我們将要看看最後一個最好的日志記錄選項是ELMAH。
ELMAH
什麼是ELMAH?
錯誤日志記錄子產品和處理程式(ELMAH)。
- 記錄幾乎所有未處理的異常。
- 用于遠端檢視記錄的異常的整個日志的網頁。
- 用于遠端檢視任何一個已記錄異常的完整詳細資訊的網頁,包括彩色堆棧跟蹤。
- 在許多情況下,您可以檢視ASP.NET為給定異常生成的原始黃色死亡螢幕,即使關閉了自定義錯誤模式也是如此。
- 每個錯誤發生時的電子郵件通知。
- 來自日志的最後15個錯誤的RSS提要。
參考來自:——https://code.google.com/archive/p/elmah/
我們将看到在Elmah中日志記錄的一種方式
- 在資料庫中
在這部分中,我們将使用ELMAH将錯誤記錄到資料庫中。首先,我們需要從NuGet包中安裝2個ELMAH包。
ELMAH記錄資料庫
從NuGet添加項目的引用
1. Elmah.MVC
2. elmah.sqlserver
安裝elmah.sqlserver包時,它建立“App_Readme”檔案夾,在該檔案夾中,它添加了SQL查詢腳本,用于建立Elmah的表和存儲過程。
以類似的方式,在安裝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 腳本後的快照
現在我們已經配置了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在資料庫中記錄錯誤後的最終輸出。
現在我們在浏覽器上存儲錯誤檢視錯誤,我們需要在web.config檔案中進行配置,如下所示。
1.在web.config中的<system.web>元素下添加的片段
片段
<!--Newly Added-->
<httpHandlers>
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
<!--Newly Added-->
2.要在web.config中的<system.webServer>元素下添加的代碼段
片段
<!--Newly Added-->
<handlers>
<add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
</handlers>
<!--Newly Added-->
3.要添加到web.config中的 <elmah>元素中的代碼段
片段
<elmah>
<security allowRemoteAccess="0" />
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" />
</elmah>
什麼是allowRemoteAccess?
預設情況下,不允許遠端通路/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個記錄器。這些記錄器已被許多公司用于真是生成應用中。
源代碼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