【问题标题】:Serilog not writing to the file with Configuration loaded from appsettings.json in Console CORE 3 AppSerilog 未写入从控制台 CORE 3 应用程序中的 appsettings.json 加载的配置的文件
【发布时间】:2022-02-04 05:01:15
【问题描述】:
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}"
            }
          }
        ]
      }
    }

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

【问题讨论】:

    标签: file .net-core serilog ilogger


    【解决方案1】:

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

    【讨论】:

    • 非常感谢它解决了,奇怪的是我从一些最新的项目中获取了这个配置,它运行良好,但它是 ASP.NET 应用程序而不是控制台。再次感谢
    猜你喜欢
    • 2020-05-20
    • 2020-07-14
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2016-12-13
    • 2020-03-11
    • 2018-12-09
    • 1970-01-01
    相关资源
    最近更新 更多