2
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 加载的配置中工作

这是应用程序代码

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}"
            }
          }
        ]
      }
    }

有趣的是,控制台接收器的部分运行良好,只是文件有问题。如何强制 serilog 写入文件?

4

1 回答 1

0

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)您指定的文件夹是否存在并且可执行文件是否有权写入该文件夹?如果文件系统不允许尝试写入文件夹路径,它可能会静默失败。

于 2020-05-19T23:33:32.373 回答