如何从多个文件中读取所有数据? [Serilog、SQLite、EF Core 6.0、C#]

问题描述 投票:0回答:1

我有一个使用 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>
c# .net sqlite serilog system.data.sqlite
1个回答
0
投票

不要将相同的 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"
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.