我有 appsettings.json 设置来自动创建日志表
"autoCreateSqlTable": true
但是我检查了SQL,却找不到该表。我似乎找不到导致它无法创建和记录信息的原因。
程序.cs:
public class Program
{
public static void Main(string[] args)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>().UseSerilog();
});
}
appsettings.json:
"Serilog": {
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "****",
"tableName": "Log",
"autoCreateSqlTable": true
}
}
]
},
我的项目基于 .Net5.0 Core MVC,项目安装了以下 nuget 包。
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.MSSqlServer" Version="5.6.0" />
下面的配置和program.cs文件对我有用。
确保 appsettings.json 中的 Serilog 有此行 "Using":["Serilog.Sinks.MSSqlServer"] 如下所示:
"Serilog": {
"Using": [ "Serilog.Sinks.MSSqlServer" ],
"MinimumLevel": "Information",
"Override": {
"Microsoft.EntityFrameworkCore.Database.Command": "Error",
"Microsoft": "Error",
"Microsoft.AspNetCore.Mvc": "Warnning"
},
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "Server=dbserverhost.domain.com;Database=DBName; Trusted_Connection=True; MultipleActiveResultSets=true",
"schemaName": "dbo",
"tableName": "AppLogs",
"autoCreateSqlTable": true
//,
//"columnOptionsSection": {
// "removeStandardColumns": [ "Properties" ]
// //,
// //"customColumns": [
// // {
// // "ColumnName": "EventType",
// // "DataType": "int",
// // "AllowNull": false
// // },
// // {
// // "ColumnName": "Release",
// // "DataType": "varchar",
// // "DataLength": 32
// // }
// //]
//}
}
,
"restrictedToMinimumLevel": "Warning"
}
]
}
我的Program.cs文件
using Serilog;
public class Program
{
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config)
//.WriteTo.File("Logs/log-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
Log.Information("Hello {Name} from thread {ThreadId}", Environment.GetEnvironmentVariable("USERNAME"), Thread.CurrentThread.ManagedThreadId);
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
var loggerFactory = services.GetRequiredService<ILoggerFactory>();
}
host.Run();
// CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Serilog 默认创建表,更多详情请点击这里
CREATE TABLE [Logs] (
[Id] int IDENTITY(1,1) NOT NULL,
[Message] nvarchar(max) NULL,
[MessageTemplate] nvarchar(max) NULL,
[Level] nvarchar(128) NULL,
[TimeStamp] datetime NOT NULL,
[Exception] nvarchar(max) NULL,
[Properties] nvarchar(max) NULL
CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ([Id] ASC)
);
在 SQL Server 中创建表需要某些权限,您的用户可能没有这些权限,并且接收器可能由于权限错误而无法创建表。
还有其他原因可能会阻止接收器连接到数据库,例如连接字符串上的拼写错误,或不正确的用户/密码等。
用于日志记录的 Serilog 接收器默认情况下是安全的,并且不会抛出异常,因此如果您想解决发生的问题,您应该查看 Serilog 的 SelfLog
例如
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
这将打印控制台中接收器的任何错误(如果您没有控制台应用程序,请更改为其他内容)
请确认您已创建
database
和 schema
。就我而言,使用 Serilog.sinks.postgresql
时,不会自动创建数据库和模式。
使用https://gist.github.com/mivano/10429656中的脚本或设置
AutoCreateSqlTable=True
.WriteTo.MSSqlServer(
connectionString: connectionString,
sinkOptions: new Serilog.Sinks.MSSqlServer.MSSqlServerSinkOptions() {
TableName = "Logs",
SchemaName="dbo",
AutoCreateSqlTable=true
}
)
我认为自动创建表有一点问题,因为 SqlServerSinkOptions 中有两个不同的属性:AutoCreateSqlDatabase 和 AutoCreateSqlTable。 对我来说,它仅在两者都设置为 true 时才创建表:
Log.Logger = new LoggerConfiguration()
.WriteTo.MSSqlServer(
connectionString: builder.Configuration.GetConnectionString("LogsDbConnection"),
sinkOptions: new MSSqlServerSinkOptions
{
AutoCreateSqlDatabase = true,
AutoCreateSqlTable = true,
TableName = "Logs",
}
)
.CreateLogger();
我已经通过遵循this简短而有用的教程成功添加了 Serilog SQL SERVER 日志记录。希望对其他人有帮助。