【问题标题】:Serilog cannot find the appsettings file using readfromSerilog 无法使用 readfrom 找到 appsettings 文件
【发布时间】:2020-11-23 02:12:36
【问题描述】:

我以前使用过这个配置很多次,从来没有遇到过任何问题,所以我把我的项目剥离了基础。我将 Specflow 与 Specrun 一起使用,而 specrun 部分是唯一发生变化的部分。

我正在尝试使用位于 my.net 核心 bin 基本目录中的 appsettings.json 文件配置 serilog 记录器。 \bin\Debug\netcoreapp3.1

以前我可以只引用没有基本路径的路径的 appsettings,但是当我从 NUnit 转移到 Specflow 时,这种情况发生了变化。仍然使用basepath仍然可以找到位置。但是,当我尝试创建记录器并使用 readfrom 时,它是从一个奇怪的位置引用 appsettings 文件,而不是我刚刚设置的配置变量中的 ConfigurationRoot。

以下是两个设置变量。第一个用于 appsettings 的配置根目录,第二个用于 serilog 记录器。第一个是成功的,它给了我看起来是一个有效的 IConfiguration 对象。第二个是错误发生的地方。这个错误是 “System.IO.FileNotFoundException:'找不到文件'\bin\Debug\netcoreapp3.1\SpecFlowPlusRunner\netcoreapp3.1\TechTalk.SpecRun.Framework.Executor.anycpu.netcoreapp3_1.deps.json'。'”

var configuration = new ConfigurationBuilder()
            .SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
            .AddJsonFile("appsettings.json")
            .Build();
        var logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

一些额外的注意事项。 这是一个 netcore 3.1 应用程序 代码在 specflow 类中执行 包含的软件包是。

<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.6" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.6" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.6" />
    <PackageReference Include="Serilog" Version="2.9.0" />
    <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
    <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
    <PackageReference Include="Serilog.Sinks.Seq" Version="4.0.0" />
    <PackageReference Include="SpecFlow" Version="3.3.57" />
    <PackageReference Include="SpecFlow.NetCore" Version="1.3.5" />
    <PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.3.57" />
    <PackageReference Include="SpecRun.SpecFlow" Version="3.3.41" />

【问题讨论】:

    标签: specflow serilog specrun


    【解决方案1】:

    我假设您的配置基本路径是错误的。 Assembly.GetExecutingAssembly() 可能正在返回 SpecFlow+ Runner 程序集之一,它包含在 SpecFlowPlusRunner 子文件夹中。

    要获取测试程序集所在的文件夹,我们有一个 API:TestRunContext.TestDirectory (https://docs.specflow.org/projects/specflow-runner/en/latest/Usage/SpecFlow-Runner-APIs.html#string-testdirectory-get)。

    这样,您应该获得 appsettings.json 所在的正确文件夹。


    完全披露:我是 SpecFlow 和 SpecFlow+ 的开发者之一。

    【讨论】:

    • 对于 TestRunContext 类非常有用。但是她就是问题。配置构建成功,其中包含 appsettings 中的所有值。所以它可以清楚地找到最初的appsettings。当我使用 readfrom 将它传递给 serilog 记录器时,即使我正在传递我之前构建的 configroot,也会发生故障。所以我能想到的就是我没有正确构建配置根或者使用特定配置根的serilog有问题。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多