在 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来使用您自己的自定义日志记录格式