Dot Net Core 애플리케이션을 위한 SQL Server 데이터베이스의 로깅 구현.
이 리포지토리에는 SQL Server 데이터베이스의 ASP.NET Core Logger 공급자 구현이 포함되어 있습니다. SQL Database 테이블에 정보를 기록할 수 있습니다. 일반적인 ASP.NET Core 로거 구현을 보려면 여기를 방문하세요.
애플리케이션에 Daenet.Common.Logging.Sql NuGet 패키지를 설치합니다 .
SqlServerLogger를 구성하고 초기화해야 합니다.
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 ( ) ;
}
콘솔 애플리케이션
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 플래그는 로깅이 특정 범위 내에서 수행될 때 사용됩니다. true로 설정되고 BeginScope("scopeStatement")를 사용하여 코드 내부에서 초기화된 경우 IncludeScope는 "Scope" 열 아래의 데이터베이스에 추가되는 모든 기록된 문에 범위 ID를 추가합니다. 다음 예에서는 includeScopes 플래그가 true로 설정된 경우 로깅에서 범위를 사용하는 방법을 보여줍니다.
using ( m_Logger . BeginScope ( $ "Scope Begins : { Guid . NewGuid ( ) } " ) )
{
//Here log something
}
범위가 시작되는 클래스의 모든 객체 인스턴스에 대해 "범위 시작: 새로운 16진수 guid "가 추가됩니다.
ConnectionString은 SQL 인증을 위한 ADO.NET 연결 문자열입니다.
TableName 은 로거가 기록해야 하는 테이블의 이름입니다.
BatchSize 데이터베이스에 메시지를 쓸 시기를 결정합니다. BatchSize
> 1이면 목록을 채우고 목록 수가 BatchSize
에 도달하거나 InsertTimerInSec
에 의해 DB에 삽입이 트리거될 때까지 기다립니다. BatchSize > 1이면 db에 데이터를 쓰는 것이 비동기입니다.
InsertTimerInSec BatchSize
에 도달하지 않았음에도 로거가 테이블에 쓸 때 경과된 시간입니다.
(1.0.7.2에서 제거됨) CreateTblIfNotExist 플래그를 true로 설정하면 데이터베이스에서 아직 사용할 수 없는 경우 구성에 제공된 테이블 이름의 테이블을 생성할 수 있는 기능을 로거에 제공합니다. 이 플래그는 개발 환경에서 로거를 테스트하는 동안 유용합니다.
includeExceptionStackTrace 플래그는 현재 구현되지 않았으며 이 플래그와 관계없이 전체 예외가 테이블에 기록됩니다.
IgnoreLoggingErrors 플래그는 로깅 시 예외가 발생할 경우 애플리케이션이 실패해야 하는지 여부를 결정하는 것입니다. false로 설정하면 현재 로거가 디버그 콘솔에 이러한 오류를 기록합니다. **경고: BatchSize = 1인 경우에만 작동합니다.
SQL 데이터베이스에 오류를 기록하려면 미리 정의된 열 형식의 테이블이 데이터베이스에 있어야 합니다. 다음 열은 로거에 의해 채워집니다.
다음 쿼리는 위의 매개변수를 사용하여 SQL Database에 새 테이블을 생성하며 기본 형식에 대한 참조 쿼리로 사용해야 합니다.
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를 제공하여 사용자 정의 로깅 형식을 사용할 수도 있습니다.