【问题标题】:Configuring Serilog RollingFile with appsettings.json使用 appsettings.json 配置 Serilog RollingFile
【发布时间】: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"

【问题讨论】:

    标签: c# serilog .net-core


    【解决方案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}] {Message}{NewLine}{Exception}")
                //.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}] {Message}{NewLine}{Exception}")
                .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}] {Message}{NewLine}{Exception}"
            }
          }
        ]
      }
    }
    

    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}] {Message}{NewLine}{Exception}"
            }
          },
          {
            "Name": "File",
            "Args": {
              "path": "C:\\Temp\\Logs\\log-appstngs.log",
              "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] [{EventId}] {Message}{NewLine}{Exception}",
              "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}] {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();
        ...
        }
    

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多