C# 使用appsettings.json配置Serilog RollingFile

C# 使用appsettings.json配置Serilog RollingFile,c#,serilog,.net-core,C#,Serilog,.net Core,我正在尝试为.NET核心项目配置Serilog。以下是我的appsettings.json中的内容: "Serilog": { "MinimumLevel": "Verbose", "Enrich": ["FromLogContext", "WithMachineName", "WithProcessId", "WithThre

我正在尝试为.NET核心项目配置Serilog。以下是我的
appsettings.json中的内容:

 "Serilog": 
{
    "MinimumLevel": "Verbose",
    "Enrich": ["FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId"],
    "WriteTo": [
      { "Name": "RollingFile",
        "Args": {
          "pathFormat": "C:/Logfiles/testapp/log-{Date}.json",
          "textFormatter": "JsonFormatter",
          "fileSizeLimitBytes": 2147483648,
          "retainedFileCountLimit": 5
        }
      }
    ]
  }
"Serilog": "2.2.1",
"Serilog.Extensions.Logging": "1.1.0",
"Serilog.Sinks.Literate": "2.0.0",
"Serilog.Sinks.Seq": "2.0.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
"Serilog.Enrichers.Thread": "2.0.0",
"Serilog.Enrichers.Process": "2.0.0",
"Serilog.Sinks.ColoredConsole": "2.0.0",
"Serilog.Settings.Configuration": "2.2.0"
我看到的问题是,
JsonFormatter
没有被拾取,而是使用默认的文本格式化程序获取条目。我尝试使用
“格式化程序”:“JsonFormatter”
,但得到了相同的结果

如果我配置Serilog-in代码,一切正常:

var jsonSink = new RollingFileSink(config["Logger:FilePath"], new JsonFormatter(), 2147483648, 5);

var logger = new Serilog.LoggerConfiguration().WriteTo.Sink(jsonSink);
以下是我的
项目.json的相关部分:

 "Serilog": 
{
    "MinimumLevel": "Verbose",
    "Enrich": ["FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId"],
    "WriteTo": [
      { "Name": "RollingFile",
        "Args": {
          "pathFormat": "C:/Logfiles/testapp/log-{Date}.json",
          "textFormatter": "JsonFormatter",
          "fileSizeLimitBytes": 2147483648,
          "retainedFileCountLimit": 5
        }
      }
    ]
  }
"Serilog": "2.2.1",
"Serilog.Extensions.Logging": "1.1.0",
"Serilog.Sinks.Literate": "2.0.0",
"Serilog.Sinks.Seq": "2.0.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
"Serilog.Enrichers.Thread": "2.0.0",
"Serilog.Enrichers.Process": "2.0.0",
"Serilog.Sinks.ColoredConsole": "2.0.0",
"Serilog.Settings.Configuration": "2.2.0"

formatter
参数必须是完全限定的类型名。尝试:

"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
以下工作:

var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "C:\\logs\\log-{Date}.txt"),
                            outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] [{EventId}] {Message}{NewLine}{Exception}")
            //.ReadFrom.Configuration(Configuration)
            .CreateLogger();

        Log.Logger.Information("test");
以下内容也适用(仅显示CreateLogger部分):

appsettings.json文件(此处的相关部分为Serilog):

project.json中的NuGet包:

  • “Serilog”:“2.3.0”
  • “Serilog.Extensions.Logging”:“1.3.1”
  • “Serilog.Sinks.RollingFile”:“3.2.0”
  • “Serilog.Sinks.File”:“3.1.1”
  • “Serilog.Settings.Configuration”:“2.2.0”

我的目标框架是net452。

以下配置有效:

"Serilog": {
"Using": [ "Serilog.Sinks.Console" ],
"MinimumLevel": "Information", 
"WriteTo": [
  {
    "Name": "Console",
    "Args": {
      "outputTemplate": "===> {Timestamp:HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}"
    }
  },
  {
    "Name": "RollingFile",
    "Args": {
      "pathFormat": "Logs\\log-{Date}.json",
      "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact",
      "fileSizeLimitBytes": 104857600
    }
  }


 ]
}
在Program.cs中:

public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
            .AddEnvironmentVariables()
            .Build();    
public static void Main(string[] args)
            {
                Log.Logger = new LoggerConfiguration()
                    .ReadFrom.Configuration(Configuration)
                    .CreateLogger();
    ...
    }


谢谢@Nicholas Blumhardt,不幸的是我仍然得到同样的结果。。。有没有可能将此示例添加到文档中?是的@Nicholas Blumhardt,更新后的配置如下:{“Name”:“RollingFile”,“Args”:{“pathFormat”:“C:/Logfiles/testapp/log-{Date}.json”,“formatter”:“Serilog.Formatting.json.json formatter,Serilog”,“fileSizeLimitBytes”:2147483648,“retainedFileCountLimit”:5}}您使用的是最新(2.2.0)版本的Serilog.Settings.Configuration吗?我们最近对另一个仍在使用2.0.0的用户进行了调查:-干杯@尼古拉斯·布卢姆哈特。它现在正在工作。我犯了最愚蠢的错误。我无意中将“Serilog”节点作为appsettings.json文件中另一个节点的一个子节。感谢@JeremyRayBrown的后续工作@Jeremy Ray Brown,据我所知,您没有使用json格式化程序-这是我无法使用的部分。滚动文件本身工作正常。误解。我将在使用Json格式化程序时跟进。
Serilog.AspNetCore 3.0.0
现在将所有这些包作为依赖项包含,因此您只需显式地包含
Serilog.AspNetCore
@yahoo,因为我有Serilog.AspNetCore包,但没有通过appsettings配置登录文件,安装上述软件包解决了json中如何包含额外属性的问题?我的日志只有@properties。@RBasniak首先,您必须检查您使用的日志“最低级别”。如果使用我的配置,请检查要记录的对象。在我的示例中,我使用了特殊的中间件来收集有关请求的额外信息,但我不能在这里发布此代码。-->需要从nuGet安装Serilog.Formatting.Compact和Serilog.Formatting.Compact.CompactJsonFormatter包
public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseConfiguration(Configuration)
                .ConfigureLogging(log => { log.AddSerilog(Log.Logger); })
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
public class UsersController : ControllerBase
{
private readonly ILogger<UsersController> _logger;

  public UsersController(ILogger<UsersController> logger)
     {
      _logger = logger;        
     }
     //your code
    }
{
"@t": "2019-04-12T14:03:08.2789776Z",
"@mt": "GetUserMessages()=> ",
"@r": [
    "000117"
],
"Elapsed": 117,
"SourceContext": "MyProject.Web.Controllers.UsersController",
"ActionId": "1b8bc4b9-5858-415b-ab4e-56ba14a5a1ca",
"ActionName": "MyProject.Web.Controllers.UsersController.GetUserMessages (MyProject.Web)",
"RequestId": "0HLLVSDFSA43ES:00000001",
"RequestPath": "/TestAppId/messages",
"CorrelationId": null,
"ConnectionId": "0HLLVSDFSA43ES"
}