我有一个使用 Entity Framework Core 和 SQLite 的应用程序。当应用程序使用 Serilog 记录到名为 Database.db 的 SQLite 数据库时。
当我的 Database.db 文件大小达到 10 MB 时,Serilog 会创建一个新的数据库文件 Database.db 并将之前的文件重命名为 Database - 当我的
Database.db
时。最后我无法从Database-someDate.db
读取数据,我只能从Database.db
读取数据。
如何从子文件中读取数据或强制数据库仅使用一个文件?
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connectionString = ConfigurationManager.ConnectionStrings["SqliteConnectionString"].ConnectionString;
optionsBuilder.UseSqlite(connectionString);
}
<connectionStrings>
<clear/>
<add name ="SqliteConnectionString"
providerName="System.Data.Sqlite"
connectionString="Data Source= ./Database.Db"/>
</connectionStrings>
NuGet 包:
我询问了 ChatGPT3.5,他给我发了一个奇怪的代码,我无法使用它,因为它不存在。我尝试在连接字符串中使用正则表达式,但我认为这是一个坏主意。
最后更新:我发现问题出在serilog中。这是我的 serilog 配置:
<appSettings>
<!--serialog-->
<add key="general:serilog:minimum-level" value="Verbose"/>
<!--serilog sqlite-->
<add key="sqlite:serilog:using:SQLite" value="Serilog.Sinks.SQLite"/>
<add key="sqlite:serilog:write-to:SQLite.sqliteDbPath" value="Database.db"/>
<add key="sqlite:serilog:write-to:SQLite.tableName" value="Logs"/>
<add key="sqlite:serilog:write-to:SQLite.storeTimestampInUtc" value="false"/>
<add key="sqlite:serilog:write-to:SQLite.autoCreateSqlTable" value="true"/>
</appSettings>
不要将相同的 SQLite 文件同时用于 Serilog 日志记录和应用程序数据。这既不是 SQLite 问题,也不是 EF Core 问题。日志数据库由 Serilog 接收器配置和控制。
如果使用Serilog.Sinks.SQLite接收器,日志数据库在达到默认最大大小时将被分割。旧文件也将根据保留阈值被删除。 如源代码所示默认最大日志大小为 10 MB。
您也不需要使用.NET Framework 配置文件。 Serilog 已经可以与 .NET Core 配置中间件配合使用。您可以使用
Serilog.AspNetCore
或 Serilog.Extensions.Hosting
并使用 .ReadFrom.Configuration(context.Configuration)
加载设置。
在Serilog 服务示例中,Serilog 与主机一起配置:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices(services => services.AddHostedService<PrintTimeService>())
.UseSerilog((context, services, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(context.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console());
这些设置是从应用程序其余部分使用的相同配置加载的。样本的
appsettings.json
包含
{
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
}
}