serilog-sinks-email icon indicating copy to clipboard operation
serilog-sinks-email copied to clipboard

[.Net Core application] How to set BatchSizeLimit in appsettings.json

Open dailyenergy opened this issue 1 year ago • 4 comments

by browsing through source code and other issues I have figured out that I can add Serilog Mail sink in appsettings as follows:

        "Name": "Email",
        "Args": {
          "From": "[email protected]",
          "To": "[email protected]",
          "Host": "localhost",
          "Port": 25,
          "Subject": "[{Level}] Log Email",
          "Body": "{Timestamp:yyyy-MM-dd HH:mm} [{Level}] <{MachineName}> {Message}{NewLine}{Exception}",
          "RestrictedToMinimumLevel": "Warning",

But I have no clue how to set BatchSizeLimit. Do I really need to create a custom extension for LoggerSinkConfiguration?

dailyenergy avatar Feb 26 '24 20:02 dailyenergy

Try this, also see https://github.com/serilog/serilog-sinks-email/issues/130

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    },
    "WriteTo": [
      {
        "Name": "Email",
        "Args": {
          "options": {
            "subject": "Serilog test",
            "from": "[email protected]",
            "to": [ "[email protected]" ],
            "host": "localhost",
            "body": "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}{Exception}{NewLine}"
          },
          "batchingOptions": {
            "batchSizeLimit": 10,
            "period": "00:00:01"
          },
          "restrictedToMinimumLevel": "Information"
        }
      }
    ]
  }
}

MrPsi avatar Apr 04 '24 08:04 MrPsi

Thanks for your help @MrPsi. I have pretty much adapted your config in my appsettings.json but I am getting one email per logged message. The batching is not working.

I get batching to work when configuring a logger in the app,

await using var log = new LoggerConfiguration()
    .WriteTo.Email(
        options: new()
        {
            From = "[email protected]",
            To = new List<string> { "[email protected]" },
            Host = "localhost",
        },
        batchingOptions: new()
        {
            BatchSizeLimit = 10,
            BufferingTimeLimit = TimeSpan.FromSeconds(30),
        })
    .CreateLogger();

log.Information("Hello from Serilog!");
log.Information("Hello again from Serilog!");

but not from appsettings.json.

Any clues as to what I'm missing?

  "Serilog": {
    "Using": [ "Serilog.Sinks.Email", "Serilog.Sinks.Console", "App", "Serilog.Sinks.File" ],
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "C:/bin/Apps/Logs/log.txt",
          "rollingInterval": "Day",
          "retainedFileCountLimit": "45"
        }
      },
      {
        "Name": "Email",
        "Args": {
          "options": {
            "subject": "App Error(s)",
            "from": "[email protected]",
            "to": [ "[email protected]" ],
            "host": "localhost",
            "body": "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}{Exception}{NewLine}"
          },
          "batchingOptions": {
            "batchSizeLimit": 10,
            "period": "00:00:01"
          },
          "restrictedToMinimumLevel": "Error"
        }
      }
    ]
  }

bfnoling avatar Jul 26 '24 02:07 bfnoling