在 Dot Net Core 應用程式的 SQL Server 資料庫中實作日誌記錄。
此儲存庫包含 SQL Server 資料庫中 ASP.NET Core Logger Provider 的實作。它使您能夠記錄 SQL 資料庫表中的資訊。有關常規 ASP.NET Core 記錄器實現,請造訪此處。
在應用程式中安裝Daenet.Common.Logging.Sql NuGet 套件。
需要配置並初始化SqlServerLogger。
ASP.NET Core Web 應用程式
public static IWebHost BuildWebHost ( string [ ] args ) =>
WebHost . CreateDefaultBuilder ( args )
. UseStartup < Startup > ( )
. ConfigureLogging ( ( hostingContext , logging ) =>
{
var loggerSection = hostingContext . Configuration . GetSection ( "Logging" ) ;
logging . AddConfiguration ( loggerSection ) ;
logging . AddConsole ( ) ;
logging . AddDebug ( ) ;
logging . AddSqlServerLogger ( ( sett ) =>
{
sett . SetSqlServerLoggerSettings ( loggerSection ) ;
} ) ;
} )
. Build ( ) ;
}
控制台應用程式
public IConfigurationRoot Configuration ;
var builder = new ConfigurationBuilder ( ) . AddJsonFile ( "appsettings.json" ) ;
Configuration = builder . Build ( ) ;
ILoggerFactory loggerFactory = new LoggerFactory ( ) . AddSqlServerLogger ( Configuration . GetSection ( "Logging" ) ) ;
ILogger logger = loggerFactory . CreateLogger < SqlServerLoggerTests > ( ) ;
在appsettings.json中,需要將SqlProvider
部分加入Logging
。
{
"Logging" : {
"IncludeScopes" : true ,
"Debug" : {
"LogLevel" : {
"Default" : " Information "
}
},
"Console" : {
"LogLevel" : {
"Default" : " Warning "
}
},
"SqlProvider" : {
"LogLevel" : {
"Default" : " Information "
},
"ConnectionString" : " " ,
"TableName" : " SqlLog " ,
"BatchSize" : 1 ,
"InsertTimerInSec" : 60 ,
"IncludeExceptionStackTrace" : false ,
"IgnoreLoggingErrors" : false ,
"ScopeSeparator" : " => "
}
}
}
LogLevel配置在全域和記錄器層級完成,請參閱 ASP.NET Core 中的日誌記錄簡介
當要在一個特定範圍內完成日誌記錄時,請使用IncludeScope標誌。 IncludeScope 設定為 true 並使用beginScope("scopeStatement")初始化內部程式碼時,會將作用域 ID 新增至新增至資料庫「Scope」列下的每個記錄語句中。以下範例說明了當IncludeScopes標誌設為 true 時在日誌記錄中使用範圍。
using ( m_Logger . BeginScope ( $ "Scope Begins : { Guid . NewGuid ( ) } " ) )
{
//Here log something
}
這將為範圍開始的類別的每個物件實例新增「範圍開始:新的十六進位 guid 」。
ConnectionString是用於 SQL 驗證的 ADO.NET 連線字串。
TableName是記錄器應記錄的表的名稱。
BatchSize決定何時將訊息寫入資料庫。如果BatchSize
> 1,那麼我們填入一個 List 並等待清單計數達到BatchSize
或InsertTimerInSec
觸發插入到資料庫。如果 BatchSize > 1 將資料寫入資料庫是非同步的。
InsertTimerInSec即使未達到BatchSize
,記錄器寫入表格時所經過的時間。
(在 1.0.7.2 中刪除) CreateTblIfNotExist標誌設定為 true 時,使記錄器能夠建立配置中提供的表名表,以防資料庫中尚不可用。在開發環境中測試記錄器時,此標誌非常有用。
IncludeExceptionStackTrace標誌目前未實現,無論此標誌為何,完整的例外都會記錄在表中。
IgnoreLoggingErrors標誌用於決定如果日誌記錄發生異常,應用程式是否應該失敗。當設定為 false 時,記錄器此時會在偵錯控制台中記錄這些錯誤。 **警告:僅當 BatchSize = 1 時才有效
要在 SQL 資料庫中記錄錯誤,資料庫中必須存在具有預先定義列格式的表。以下列由記錄器填充 -
以下查詢將使用上述參數在 SQL 資料庫中建立新表,並套用預設格式的參考查詢。
CREATE TABLE [dbo].[YourTableName](
[Id] [ bigint ] IDENTITY( 1 , 1 ) NOT NULL ,
[EventId] [ int ] NULL ,
[Type] [nvarchar]( 15 ) NOT NULL ,
[Scope] [nvarchar](MAX) NULL ,
[Message] [nvarchar](max) NOT NULL ,
[Exception] [nvarchar](max) NULL ,
[ TimeStamp ] [datetime] NOT NULL ,
[CategoryName] [nvarchar] (max) NULL ,
CONSTRAINT [PK_YourTableName] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
也可以將參數記錄到資料庫中。在此範例中,我們要將 RequestId 和範圍記錄到資料庫中。為此,您當然必須建立列。
此配置必須附加到Logging
中的SqlProvider
部分。
以下是如何記錄 2 個 .NET Core 內部日誌記錄參數的範例。您可以使用日誌記錄中使用的參數來擴展它。這裡的一個很好的例子是{method}
用於以通用方式記錄方法名稱。
"ScopeColumnMapping" : {
"RequestId" : " RequestId " ,
"SCOPEPATH" : " Scope "
}
也可以透過提供loggingFormatter來使用您自己的自訂日誌記錄格式