Implémentation de la journalisation dans la base de données SQL Server pour les applications Dot Net Core.
Ce référentiel contient l'implémentation du fournisseur ASP.NET Core Logger dans la base de données SQL Server. Il vous permet de consigner les informations dans la table de la base de données SQL. Pour l’implémentation générale de l’enregistreur ASP.NET Core, visitez ici.
Installez le package NuGet Daenet.Common.Logging.Sql dans votre application.
Le SqlServerLogger doit être configuré et initialisé.
Application Web ASP.NET Core
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 ( ) ;
}
Application console
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 > ( ) ;
Dans appsettings.json , la partie SqlProvider
doit être ajoutée à 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" : " => "
}
}
}
La configuration de LogLevel est effectuée au niveau global et au niveau de l'enregistreur, voir Introduction à la journalisation dans ASP.NET Core
L’indicateur IncludeScope est utilisé lorsque la journalisation doit être effectuée dans une étendue particulière. IncludeScope lorsqu'il est défini sur true et initialisé dans le code avec beginScope("scopeStatement") ajoute l'ID de portée à chaque instruction enregistrée qui est ajoutée à la base de données sous la colonne "Scope". L'exemple suivant illustre l'utilisation de la portée dans la journalisation lorsque l'indicateur IncludeScopes est défini sur true.
using ( m_Logger . BeginScope ( $ "Scope Begins : { Guid . NewGuid ( ) } " ) )
{
//Here log something
}
Cela ajoutera « La portée commence : nouveau guid hexadécimal » pour chaque instance d'objet de la classe où la portée commence.
ConnectionString est une chaîne de connexion ADO.NET pour l'authentification SQL.
TableName est le nom de la table dans laquelle l'enregistreur doit se connecter.
BatchSize Décide quand écrire les messages dans la base de données. Si BatchSize
> 1, nous remplissons une liste et attendons que le nombre de listes atteigne BatchSize
ou que l'insertion dans la base de données soit déclenchée par InsertTimerInSec
. Si BatchSize > 1, l’écriture des données dans la base de données est asynchrone.
InsertTimerInSec Temps écoulé lorsque l'enregistreur écrit dans la table, même si BatchSize
n'est pas atteint.
(SUPprimé dans 1.0.7.2) L'indicateur CreateTblIfNotExist, lorsqu'il est défini sur true, donne à l'enregistreur la possibilité de créer la table du nom de table fournie dans la configuration au cas où elle ne serait pas déjà disponible dans la base de données. Cet indicateur est utile lors du test du logger dans un environnement de développement.
L’indicateur IncludeExceptionStackTrace n’est actuellement pas implémenté et l’exception complète est enregistrée dans la table quel que soit cet indicateur.
L'indicateur IgnoreLoggingErrors sert à décider si l'application doit échouer si une exception se produit lors de la journalisation. Lorsqu'il est défini sur false, l'enregistreur enregistre actuellement ces erreurs dans la console de débogage. **ATTENTION : fonctionne uniquement si BatchSize = 1
Pour enregistrer l'erreur dans la base de données SQL, une table doit être présente dans la base de données avec un format de colonne prédéfini. Les colonnes suivantes sont remplies par l'enregistreur -
La requête suivante créera une nouvelle table dans la base de données SQL avec les paramètres ci-dessus et devra être utilisée comme requête de référence pour le format par défaut.
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]
Il est également possible de consigner les paramètres dans la base de données. Dans cet exemple, nous souhaitons enregistrer le RequestId et la portée dans la base de données. Pour que cela fonctionne, il faut bien sûr créer les colonnes.
Cette configuration doit être ajoutée à la section SqlProvider
dans Logging
.
Voici un exemple de la façon de consigner les paramètres de journalisation interne de 2 .NET Core. Vous pouvez étendre cela avec les paramètres que vous utilisez dans votre journalisation. Un bon exemple ici est {method}
pour enregistrer le nom de la méthode de manière générale.
"ScopeColumnMapping" : {
"RequestId" : " RequestId " ,
"SCOPEPATH" : " Scope "
}
Il est également possible d'utiliser votre propre format de journalisation personnalisé en fournissant loggingFormatter