Implementierung der Protokollierung in der SQL Server-Datenbank für Dot Net Core-Anwendungen.
Dieses Repository enthält die Implementierung des ASP.NET Core Logger-Anbieters in der SQL Server-Datenbank. Es ermöglicht Ihnen, die Informationen in der SQL-Datenbanktabelle zu protokollieren. Informationen zur allgemeinen ASP.NET Core-Logger-Implementierung finden Sie hier.
Installieren Sie das Daenet.Common.Logging.Sql NuGet-Paket in Ihrer Anwendung.
Der SqlServerLogger muss konfiguriert und initialisiert werden.
ASP.NET Core-Webanwendung
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 ( ) ;
}
Konsolenanwendung
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 > ( ) ;
In appsettings.json muss der SqlProvider
Teil zu Logging
hinzugefügt werden.
{
"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" : " => "
}
}
}
Die LogLevel- Konfiguration erfolgt auf globaler und Logger-Ebene, siehe Einführung in die Protokollierung in ASP.NET Core
Das IncludeScope- Flag wird verwendet, wenn die Protokollierung innerhalb eines bestimmten Bereichs erfolgen soll. Wenn IncludeScope auf „true“ gesetzt und im Code mit beginScope(„scopeStatement“) initialisiert wird, fügt es jeder protokollierten Anweisung, die der Datenbank in der Spalte „Scope“ hinzugefügt wird, eine Bereichs-ID hinzu. Das folgende Beispiel veranschaulicht die Verwendung des Bereichs bei der Protokollierung, wenn das IncludeScopes -Flag auf „true“ gesetzt ist.
using ( m_Logger . BeginScope ( $ "Scope Begins : { Guid . NewGuid ( ) } " ) )
{
//Here log something
}
Dadurch wird für jede Objektinstanz der Klasse, bei der der Gültigkeitsbereich beginnt, „Scope beginnt: neue hexadezimale Guid “ hinzugefügt.
ConnectionString ist eine ADO.NET-Verbindungszeichenfolge für die SQL-Authentifizierung.
TableName ist der Name der Tabelle, in der der Logger protokollieren soll.
BatchSize entscheidet, wann Nachrichten in die Datenbank geschrieben werden. Wenn BatchSize
> 1, dann füllen wir eine Liste und warten, bis die Listenanzahl BatchSize
erreicht oder das Einfügen in die Datenbank durch InsertTimerInSec
ausgelöst wird. Wenn BatchSize > 1 ist, erfolgt das Schreiben der Daten in die Datenbank asynchron.
InsertTimerInSec Zeit, die verstrichen ist, wenn der Logger in die Tabelle schreibt, selbst wenn BatchSize
nicht erreicht ist.
(ENTFERNT in 1.0.7.2) Wenn das Flag „CreateTblIfNotExist“ auf „true“ gesetzt ist, kann der Logger die Tabelle mit dem in der Konfiguration bereitgestellten Tabellennamen erstellen, falls dieser noch nicht in der Datenbank verfügbar ist. Dieses Flag ist beim Testen des Loggers in der Entwicklungsumgebung nützlich.
Das Flag „IncludeExceptionStackTrace“ ist derzeit nicht implementiert und unabhängig von diesem Flag wird eine vollständige Ausnahme in der Tabelle protokolliert.
Mit dem IgnoreLoggingErrors -Flag wird entschieden, ob die Anwendung fehlschlagen soll, wenn bei der Protokollierung eine Ausnahme auftritt. Wenn der Logger auf „false“ gesetzt ist, protokolliert er diese Fehler derzeit in der Debug-Konsole. **WARNUNG: Funktioniert nur, wenn BatchSize = 1
Um den Fehler in der SQL-Datenbank zu protokollieren, muss in der Datenbank eine Tabelle mit einem vordefinierten Spaltenformat vorhanden sein. Folgende Spalten werden vom Logger gefüllt:
Die folgende Abfrage erstellt eine neue Tabelle in der SQL-Datenbank mit den oben genannten Parametern und sollte als Referenzabfrage für das Standardformat verwendet werden.
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]
Es ist auch möglich, Parameter in der Datenbank zu protokollieren. In diesem Beispiel möchten wir die RequestId und den Bereich in der Datenbank protokollieren. Damit dies funktioniert, müssen Sie natürlich die Spalten erstellen.
Diese Konfiguration muss an den SqlProvider
-Abschnitt in Logging
angehängt werden.
Hier ist ein Beispiel für die Protokollierung der beiden internen Protokollierungsparameter von .NET Core. Sie können dies mit den Parametern erweitern, die Sie in Ihrer Protokollierung verwenden. Ein gutes Beispiel hierfür ist {method}
zur allgemeinen Protokollierung des Methodennamens.
"ScopeColumnMapping" : {
"RequestId" : " RequestId " ,
"SCOPEPATH" : " Scope "
}
Es ist auch möglich, Ihr eigenes benutzerdefiniertes Protokollierungsformat zu verwenden, indem Sie loggingFormatter bereitstellen