使用 appsettings.json 配置 Serilog RollingFile

Posted

技术标签:

【中文标题】使用 appsettings.json 配置 Serilog RollingFile【英文标题】:Configuring Serilog RollingFile with appsettings.json 【发布时间】:2017-04-14 07:08:59 【问题描述】:

我正在尝试为 .NET Core 项目配置 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
        
      
    ]
  

我看到的问题是 JsonFormatter 没有被拾取,而是我使用默认文本格式化程序获取条目。我尝试使用"formatter": "JsonFormatter",但得到了相同的结果。

如果我在代码中配置 Serilog,一切正常:

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

var logger = new Serilog.LoggerConfiguration().WriteTo.Sink(jsonSink);

这里是我project.json的相关部分:

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

【问题讨论】:

【参考方案1】:

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

"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"

【讨论】:

感谢@Nicholas Blumhardt,不幸的是我仍然得到相同的结果...有没有机会将此示例添加到文档中? 是的@Nicholas Blumhardt,更新后的配置如下所示: "Name": "RollingFile", "Args": "pathFormat": "C:/Logfiles/testapp/log- Date.json", "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog", "fileSizeLimitBytes": 2147483648, "retainedFileCountLimit": 5 您使用的是最新 (2.2.0) 版本的 Serilog.Settings.Configuration 吗?我们最近调查了另一位仍在使用 2.0.0 的用户:github.com/serilog/serilog-settings-configuration/issues/31 - 干杯! @NicholasBlumhardt。它现在正在工作。我犯了最愚蠢的错误。我不小心将“Serilog”节点设置为 appsettings.json 文件中另一个节点的子部分。 感谢@JeremyRayBrown 的跟进【参考方案2】:

以下作品:

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] MessageNewLineException")
            //.ReadFrom.Configuration(Configuration)
            .CreateLogger();

        Log.Logger.Information("test");

以下也有效(仅显示 CreateLogger 部分):

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] MessageNewLineException")
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();

appsettings.json 文件(这里的相关部分是 Serilog):


  "Logging": 
    "IncludeScopes": false,
    "LogLevel": 
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    
  ,
  "Serilog": 
    "MinimumLevel": "Debug",
    "WriteTo": [
      
        "Name": "RollingFile",
        "Args": 
          "pathFormat": "C:\\logs\\log-Date.txt",
          "outputTemplate": "Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz [Level] [SourceContext] [EventId] MessageNewLineException"
        
      
    ]
  

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。

【讨论】:

Jeremy Ray Brown,据我所知,您没有使用 Json 格式化程序 - 这是我无法工作的地方。 RollingFile 本身工作正常。 好的。误解。我会在使用 Json Formatter 时跟进。 Serilog.AspNetCore 3.0.0 现在包含所有这些包作为依赖项,因此您只需要显式包含Serilog.AspNetCore @YahooSerious 我有 Serilog.AspNetCore 包,但没有通过 appsettings 配置登录文件,安装上述包解决了它 为什么"IncludeScopes": false,"Logging": 之下? json.schemastore.org/appsettings.json 说它必须在 FormatterOptions 之下【参考方案3】:

这对我来说很好。不再支持“RollingFile”,因此“File”和“pathFormat”只是“path”

"Serilog": 
    "Using": [ "Serilog.Sinks.File" ],
    "MinimumLevel": 
      "Default": "Debug",
      "Override": 
        "Microsoft": "Debug",
        "System": "Debug"
      
    ,
    "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
    "WriteTo": [
      
        "Name": "Console",
        "Args": 
          "outputTemplate": "===> Timestamp:HH:mm:ss [Level] MessageNewLineException"
        
      ,
      
        "Name": "File",
        "Args": 
          "path": "C:\\Temp\\Logs\\log-appstngs.log",
          "outputTemplate": "Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz [Level] [SourceContext] [EventId] MessageNewLineException",
          "rollOnFileSizeLimit": true,
          "fileSizeLimitBytes": 4194304,
          "retainedFileCountLimit": 10,
          "rollingInterval": "Minute"
        
      
    ]
  ,

【讨论】:

它不生成日志文件。你能提出什么问题吗? 可能是应用用户没有必要的权限?【参考方案4】:

以下配置有效:

"Serilog": 
"Using": [ "Serilog.Sinks.Console" ],
"MinimumLevel": "Information", 
"WriteTo": [
  
    "Name": "Console",
    "Args": 
      "outputTemplate": "===> Timestamp:HH:mm:ss [Level] MessageNewLineException"
    
  ,
  
    "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();
    ...
    

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"

【讨论】:

你是如何在 json 中包含额外的属性的?我的日志只有 @ 属性。 @RBasniak 首先,您必须检查您使用的日志记录的“最低级别”。如果您使用我的配置 - 请检查您要记录的对象。在我的示例中,我使用了特殊的中间件来收集有关请求的额外信息,但我无法在此处发布此代码。 --> 需要从nuGet安装包Serilog.Formatting.Compact和Serilog.Formatting.Compact.CompactJsonFormatter【参考方案5】:

我知道,这是一篇旧帖子,但迄今为止没有人接受任何答案。因此,这是我认为的问题:选择了格式化程序类,但未指定其命名空间。以下内容对我有用:

"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog.Formatting.Json"

【讨论】:

以上是关于使用 appsettings.json 配置 Serilog RollingFile的主要内容,如果未能解决你的问题,请参考以下文章

在 EF 上下文中使用 appsettings.json 配置

使用nuget包向appsettings.json添加配置

使用appsettings.json配置Kestrel监听端口Dotnet core 2 preview 2

如何使用 .NET Core 根据发布配置文件更新 appsettings.json?

为 ASP.NET Core 配置引用 appsettings.json 中的另一个 json 文件

ASP.NET Core读取appsettings.json配置文件信息