web-dev-qa-db-ja.com

Serilogがasp.net core 2.2 APIの構成から機能しない

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
           .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
           .UseStartup<Startup>();
}


public class Startup
{
    public IContainer Container { get; private set; }
    public Startup(IConfiguration configuration)
    {
        Log.Warning("test");
        Configuration = configuration;
    }

}

appsettings.json

{
    "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Default": "Information",
        "Microsoft": "Information",
        "System": "Information"
      }
    },
    "WriteTo": [

      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "C:\\test.txt",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
          "restrictedToMinimumLevel": "Information"
        }
      }
    ]
  },

  "AllowedHosts": "*"
}

すべてのパッケージがインストールされています

  • セリログ、
  • Serilog.AspCore、
  • Serilog.Settings.Configuration、
  • Serilog.Sink.File
7
Zoinky

あなたの設定はRollingFile用ですが、パッケージリストにはSerilog.Sinks.Fileと書かれています。これらは異なります。 Serilog.Sinks.RollingFileパッケージを追加する必要があり、動作を開始するはずです。

Fileシンク(コメントで@Kirkが言及したように、現在推奨されているオプション)を使用する場合は、設定を次のように変更する必要があります。

"WriteTo": [
    {
        "Name": "File",
        "Args": {
            "path": "C:\\test.txt",
            "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
            "restrictedToMinimumLevel": "Information"
        }
    }

[〜#〜] note [〜#〜]

pathFormatは、pathシンクのFileでなければなりません

Serilog File Sink Documentation を参照してください

6
Simply Ged

問題はc:に直接書き込みを行っていたようで、設定でFileを使用していないようです。

これに遭遇した人のための最終的な解決策があります

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
              WebHost.CreateDefaultBuilder(args)
                  .UseStartup<Startup>()
                  .UseSerilog();
}

Startup.cs

public Startup(IConfiguration configuration)
{
        var logConfiguration = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration);

        Log.Logger = logConfiguration.CreateLogger();
        Configuration = configuration;

}

appsettings.json

"Serilog": {
"WriteTo": [
  {
    "Name": "File",
    "Args": {
      "path": "C:\\temp\\log.txt",
      "rollingInterval": "Day"
    }
  }
]

}

0
Zoinky

これは答えではなく、観察です。ここで明確な問題を観察しました。 3つの設定ファイルがあります。

  1. appsettings.json、
  2. appsettings.Development.json、
  3. appsettings.VivekDev.json

launchSettings.jsonからプロファイルを選択し、次のように環境がVivekDevになるようにしました。

"ASPNETCORE_ENVIRONMENT": "VivekDev"

appsettings.VivekDev.jsonに次の設定があり、appsettings.jsonにSerilog設定がない場合、問題なく動作します。

  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "log.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  },

しかし、私が持っているとき

"Serilog": {
  "WriteTo": [ "Debug" ]
},

appsettings.jsonの場合、これはappsettings.VivekDev.jsonの設定を何らかの理由で上書きします。私の理解では、これは正しくなく、appsettings.VivekDev.json内の設定はappsettings.jsonをオーバーライドする必要があります。

これは、ファイルシンクの場合にのみ発生します。コンソールなどの他のシンクを使用している場合、期待どおりに動作します。 appsettings.VivekDev.json内のserilog設定は、appsettings.jsonのserilog設定を正しくオーバーライドしています。

ここでは間違いなくバグがあります。

そのため、今ではappsettings.jsonのserilog設定を削除し、appsettings.VivekDev.jsonのserilogファイルへの書き込み設定を保持しています。

0
VivekDev