使用appsettings.json配置Serilog RollingFile

32

我正在尝试为一个.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"
5个回答

23

formatter 参数需要是一个完全限定的类型名称。尝试:

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

嗨,@Alexander - 你把参数名称从 textFormatter 改成了 formatter 吗? - Nicholas Blumhardt
2
是的@Nicholas Blumhardt,这是更新后的配置:{ "Name": "RollingFile", "Args": { "pathFormat": "C:/Logfiles/testapp/log-{Date}.json", "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog", "fileSizeLimitBytes": 2147483648, "retainedFileCountLimit": 5 } } - Alexander
1
你是否正在使用最新的(2.2.0)Serilog.Settings.Configuration版本?我们最近为另一个仍在使用2.0.0版本的用户进行了调查:https://github.com/serilog/serilog-settings-configuration/issues/31 - 干杯! - Nicholas Blumhardt
4
现在它已经可以工作了。我犯了一个非常愚蠢的错误。我不小心把"Serilog"节点变成了appsettings.json文件中另一个节点的子级。 - Jeremy Ray Brown
1
感谢您的跟进@JeremyRayBrown。 - Nicholas Blumhardt
显示剩余4条评论

17

以下内容有效:

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

项目中的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。


1
Jeremy Ray Brown,就我所看到的,您没有使用Json格式化程序 - 这是我无法使其工作的部分。RollingFile本身运行良好。 - Alexander
好的。误解了。我会在使用 Json 格式化工具后跟进。 - Jeremy Ray Brown
1
Serilog.AspNetCore 3.0.0 现在已经包含了所有这些依赖项,因此您只需要显式地包含 Serilog.AspNetCore 即可。 - Yahoo Serious
2
@YahooSerious,我有Serilog.AspNetCore包,但无法通过appsettings配置记录日志文件,安装上述包解决了问题。 - Ehsan Sajjad
为什么在“Logging”下面要加上“IncludeScopes:false,”?https://json.schemastore.org/appsettings.json说它必须在“FormatterOptions”下面。 - David Klempfner

14

这对我来说很好用。“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"
        }
      }
    ]
  },

1
它不生成日志文件。你能建议一下可能出了什么问题吗? - Priya
应用程序用户可能没有必要的权限? - Mujib Khan

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
1
@RBasniak 首先,您必须检查您使用的日志记录的“MinimumLevel”。如果您使用我的配置,请检查要记录的对象。在我的示例中,我使用了特殊的中间件来收集有关请求的额外信息,但我无法在此处发布此代码。 - Dmytro
需要从nuGet安装Serilog.Formatting.Compact和Serilog.Formatting.Compact.CompactJsonFormatter包。 - Felipe Augusto

1

我知道这是一篇旧帖子,但截至目前还没有被接受的答案。所以,我认为问题在于选择了格式化程序类,但没有指定其命名空间。以下类似的代码对我有用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接