Implementação de Logging em Banco de Dados SQL Server para Aplicações Dot Net Core.
Este repositório contém a implementação do provedor de log do ASP.NET Core no banco de dados SQL Server. Ele permite que você registre as informações na tabela do Banco de Dados SQL. Para implementação geral do registrador ASP.NET Core, visite aqui.
Instale o pacote NuGet Daenet.Common.Logging.Sql em seu aplicativo.
O SqlServerLogger precisa ser configurado e inicializado.
Aplicativo 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 ( ) ;
}
Aplicativo de 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 > ( ) ;
No appsettings.json , a parte SqlProvider
precisa ser adicionada ao 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" : " => "
}
}
}
A configuração do LogLevel é feita no nível global e do logger, consulte Introdução ao log no ASP.NET Core
O sinalizador IncludeScope é usado quando o registro deve ser feito dentro de um escopo específico. IncluirScope quando definido como verdadeiro e inicializado dentro do código com BeginScope("scopeStatement") adiciona o ID do escopo a cada instrução registrada que é adicionada ao banco de dados na coluna "Escopo". O exemplo a seguir ilustra o uso do escopo no log quando o sinalizador IncludeScopes está definido como verdadeiro.
using ( m_Logger . BeginScope ( $ "Scope Begins : { Guid . NewGuid ( ) } " ) )
{
//Here log something
}
Isso adicionará "Escopo começa: novo guid hexadecimal " para cada instância de objeto da classe onde o escopo foi iniciado.
ConnectionString é uma string de conexão ADO.NET para autenticação SQL.
TableName é o nome da tabela onde o logger deve registrar.
BatchSize Decide quando gravar mensagens no banco de dados. Se BatchSize
> 1 então preenchemos uma Lista e esperamos até que a contagem da lista atinja BatchSize
ou Insert to DB seja acionado por InsertTimerInSec
. Se BatchSize > 1, a gravação dos dados no banco de dados é assíncrona.
InsertTimerInSec Tempo decorrido quando o logger grava na tabela, mesmo que BatchSize
não seja atingido.
(REMOVIDO em 1.0.7.2) O sinalizador CreateTblIfNotExist, quando definido como verdadeiro, dá ao criador de logs a capacidade de criar a tabela de nome da tabela fornecida na configuração, caso ainda não esteja disponível no banco de dados. Este sinalizador é útil ao testar o criador de logs no ambiente de desenvolvimento.
O sinalizador IncludeExceptionStackTrace não está implementado no momento e a exceção completa é registrada na tabela, independentemente deste sinalizador.
O sinalizador IgnoreLoggingErrors serve para decidir se o aplicativo deve falhar se ocorrer uma exceção no log. Quando definido como falso, o criador de logs no momento registra esses erros no console de depuração. **AVISO: Só funciona se BatchSize = 1
Para registrar o erro no banco de dados SQL, uma tabela deve estar presente no banco de dados com formato de coluna predefinido. As colunas a seguir são preenchidas pelo logger -
A consulta a seguir criará uma nova tabela no Banco de Dados SQL com os parâmetros acima e deverá ser usada como uma consulta de referência para o formato padrão.
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]
Também é possível registrar parâmetros no banco de dados. Neste exemplo, queremos registrar o RequestId e o escopo no banco de dados. Para que isso funcione, você deve criar as colunas, é claro.
Esta configuração deve ser anexada à seção SqlProvider
em Logging
.
Aqui está um exemplo de como registrar os dois parâmetros de registro interno do .NET Core. Você pode estender isso com os parâmetros usados em seu registro. Um bom exemplo aqui é {method}
para registrar o nome do método de uma forma geral.
"ScopeColumnMapping" : {
"RequestId" : " RequestId " ,
"SCOPEPATH" : " Scope "
}
Também é possível usar seu próprio formato de registro personalizado, fornecendo loggingFormatter