file - Serilog 不写入配置从 Console CORE 3 App 中的 appsettings.json 加载的文件

标签 file .net-core serilog ilogger

ASP.NET CORE 3.1 Worker Service Application.

Packages

"Microsoft.EntityFrameworkCore.Design" Version="3.1.3"

PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3"

PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="3.1.3"

PackageReference Include="Serilog.AspNetCore" Version="3.2.0"

PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0"

Serilog 使用硬编码的 LoggerConfiguration 写入文件,但无法从从 appsettings.json 加载的 Config 工作

这是应用程序代码

public static class Program
{
    public static IConfigurationRoot Configuration { get; set; }
    private static string _environmentName;

    public static void Main(string[] args)
    {
        var hostBuilder = CreateHostBuilder(args).Build();
        //Log.Logger = (Configuration["Logging:LogLevel:Default"] == "Debug")? 
        //    new LoggerConfiguration()
        //    .MinimumLevel.Debug()
        //    .WriteTo.Console()
        //    .WriteTo.File(path: Path.Combine("C:/LogFiles", "OA-EmailService-.log"),
        //        rollingInterval: RollingInterval.Day, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(10))
        //    .CreateLogger()
        //    :
        //    new LoggerConfiguration()
        //        .WriteTo.Console()
        //        .WriteTo.File(path: Path.Combine("C:/LogFiles", "OA-EmailService-.log"),
        //            rollingInterval: RollingInterval.Day, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(10))
        //        .CreateLogger()
        //    ;
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();

        try
        {
            Log.Information("APP:App started");
            hostBuilder.Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "APP:App startup failed");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, config) =>
            {
                config.ClearProviders();  //Disabling default integrated logger
                _environmentName = hostingContext.HostingEnvironment.EnvironmentName;
            })
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                Configuration = new ConfigurationBuilder()
                    .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    //.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json",
                    //    optional: false, 
                    //    reloadOnChange: true)
                    .AddEnvironmentVariables()
                    .Build();
            })
            .UseSerilog()
            .UseWindowsService()
            .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); });
}

这里是 appsettings.json

    {
      "Serilog": {
        "MinimumLevel": "Debug",
        "WriteTo": [
          {
            "Name": "Console",
            "Args": {
              "outputTemplate": "===> {Timestamp:HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
            }
          },
          {
            "Name": "RollingFile",
            "Args": {
              "pathFormat": "C:/LogFiles/OA-EmailService-.log",
              "outputTemplate": "===> {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
            }
          }
        ]
      }
    }

有趣的是,Console sink 部分工作正常,只是文件有问题。如何强制 serilog 写入文件?

最佳答案

1) 您是否安装了正确的接收器包?您在 https://github.com/serilog/serilog-sinks-rollingfile 显示了(已弃用的)滚动文件接收器的参数。/https://www.nuget.org/packages/Serilog.Sinks.RollingFile/ ,必须主动安装才能运行 appsettings 值。

首选 Serilog.Sinks.File 包的语法如下:

"Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": ".\\yourpath\\yourfile.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  }

2) 您指定的文件夹是否存在,可执行文件是否有权写入该文件夹?如果不允许尝试写入文件夹路径,它可能会静默失败由文件系统。

关于file - Serilog 不写入配置从 Console CORE 3 App 中的 appsettings.json 加载的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61902429/

相关文章:

javascript - 获取调用的 javascript 文件上的查询字符串

c# - 无法隐式转换类型 'Microsoft.AspNetCore.Mvc.BadRequestObjectResult'

c# - appsettings-configuration 中的 Serilog PushProperty 不起作用

java - 如何获取 .java 文件的目录

php - 在现有文件中写入数据 Yii2 框架

.net-core - 无法通过 dotnet build 命令编译模板 C++/CLI (.NET Core 3.1) 项目

c# - 微软依赖注入(inject)框架中Autofac的聚合服务相当于什么

c# - Serilog.Extras.AppSettings 和复杂对象

Serilog ms sql 接收器不写入我的表

c++ - 如何在 C++ 中将文本文件传输到二维数组?