serilog / serilog-settings-configuration

A Serilog configuration provider that reads from Microsoft.Extensions.Configuration
Apache License 2.0
446 stars 129 forks source link

configureLogger doesn't work for published app #340

Open SvetlanaLevi opened 1 year ago

SvetlanaLevi commented 1 year ago

I need to specify different filters for each sink and example above is working correctly in debug mode, but after publishing application as self-contained logs failed to write.

{
  "Serilog": {
    "MinimumLevel": "Debug",
    "Using": [
      "Serilog.Sinks.Console",
      "Serilog.Sinks.File",
      "Serilog.Expressions"
    ],
    "WriteTo": [
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "Filter": [
              {
                "Name": "ByExcluding",
                "Args": {
                  "expression": "StartsWith(SourceContext, 'System.Net.Http.HttpClient.HttpMarkingService.LogicalHandler')"
                }
              }
            ],
            "WriteTo": [
              {
                "Name": "Console",
                "Args": {
                  "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {NewLine}"
                }
              }
            ]
          }
        }
      },
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "log.txt",
                  "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
                }
              }
            ]
          }
        }
      }
    ]
  }
}

Without nested "WriteTo" sections it works fine.

0xced commented 1 year ago

You might want to try the overload that takes an explicit list of assemblies when publishing as single file.

var configurationAssemblies = new[]
{
    typeof(SerilogExpression).Assembly,                    // Serilog.Expressions
    typeof(ConsoleLoggerConfigurationExtensions).Assembly, // Serilog.Sinks.Console
    typeof(FileLoggerConfigurationExtensions).Assembly,    // Serilog.Sinks.File
};
loggerConfiguration.ReadFrom.Configuration(configuration, configurationAssemblies);

You might also want to enable Serilog self logs in order to diagnose potential issues.

SelfLog.Enable(Console.Error);