简体   繁体   English

Serilog:RollingFile 在带有“appsettings.json”的 asp.net 核心中不起作用

[英]Serilog : RollingFile is not working in asp.net core with 'appsettings.json'

I am using asp.net core(website) and Serilog for logging.我正在使用 asp.net core(website) 和 Serilog 进行日志记录。

Nuget packages installed are安装的 Nuget 包是

Serilog
Serilog.AspNetCore
Serilog.Extensions.Logging
Serilog.Extensions.Logging.File
Serilog.Settings.Configuration
Serilog.Sinks.File
Serilog.Sinks.RollingFile
Microsoft.Extensions.Logging

Settings in Main.cs file are : Main.cs 文件中的设置是:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
             .ConfigureAppConfiguration((WebHostBuilderContext, configurationBuilder) =>
             {
                 configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                 configurationBuilder.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true);
                 configurationBuilder.AddEnvironmentVariables();
             })
             .ConfigureLogging((hostingContext, loggingBuilder) =>
             {
                 loggingBuilder.ClearProviders();
                 loggingBuilder.AddSerilog();
             })
            .UseStartup<Startup>();  
}

What is working :什么工作:

In Startup.cs file if I write following code the logging file is getting created.在 Startup.cs 文件中,如果我编写以下代码,则会创建日志文件。 Here I am specifying the configurations in code itself.在这里,我在代码本身中指定配置。

  public void Configure(IApplicationBuilder app,
                                IHostingEnvironment env,
                                ILoggerFactory loggerFactory)
    {
     string logFilePath = Path.Combine(env.ContentRootPath, "Logs/ImportManager2-{Date}.txt");

    Log.Logger = new LoggerConfiguration()
       .MinimumLevel.Debug()
       .WriteTo.RollingFile(logFilePath)
       .CreateLogger();

     loggerFactory.AddSerilog();

     --
     --
    }

When I am using appsettings.json file with following content当我使用具有以下内容的 appsettings.json 文件时

{
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MyDatabaseLocal": "Server=_;Database=_;MultipleActiveResultSets=true;Connection Timeout=333;Integrated Security=SSPI",
    "OtherDatabaseLocal": "Server=_;Database=_;MultipleActiveResultSets=true;Connection Timeout=333;Integrated Security=SSPI"
  },
  "Serilog": {
    "MinimumLevel": "Debug",
    "Override": {
      "Microsoft": "Warning"
    },
    "Using": [
      "Serilog.Sinks.Console",
      "Serilog.Sinks.File"
    ],
    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": {
          "path": "Logs/MyProject.txt"
        }
      }
    ]
  }
}

and changed the startup.cs file like并更改了 startup.cs 文件,例如

public void Configure(IApplicationBuilder app,
                            IHostingEnvironment env,
                            ILoggerFactory loggerFactory)
{

 Log.Logger = new LoggerConfiguration()
             .ReadFrom.Configuration(Configuration.GetSection("Serilog"))
             .CreateLogger();

 loggerFactory.AddSerilog();
 --
 --
}

After this there is not file created.在此之后没有创建文件。 What could be the problem.可能是什么问题呢。

The following call is not quite working how you're expecting:以下调用并不完全符合您的期望:

.ReadFrom.Configuration(Configuration.GetSection("Serilog"))

When using this extension method, Serilog expects that there will be a section named Serilog within the configuration that you pass through .使用此扩展方法时,Serilog 期望在您传递的配置中会有一个名为Serilog的部分。 In your example, you're passing the Serilog section itself, but then it's looking for another Serilog section within that .在你的榜样,您要传递Serilog节本身,而是那么它寻找另一个Serilog内的部分。

Update the call to just pass through Configuration , like this:将调用更新为仅通过Configuration ,如下所示:

.ReadFrom.Configuration(Configuration)

Serilog will find your Serilog section and consume the settings from that. Serilog 将找到您的Serilog部分并使用其中的设置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM