web-dev-qa-db-ja.com

例外がスローされたときにSerilogを使用してスタックトレースをログに記録するASP.NETCore 2.0

そのため、最近asp.netコアアプリケーションの構築を開始し、ロギングにはSeriLogを使用しています。これは最近まで正常に機能していましたが、ほとんどの場合、例外のスタックトレースがログに転送されていないことがわかりました。 .WriteTo.RollingFile()メソッドを使用して、Startup.csのLoggerConfigurationの.txtファイルに次のように書き込みます。

public void ConfigureServices(IServiceCollection services)
{
    //add a bunch of services

    services.AddLogging(builder =>
    {
        builder.AddConsole();
        builder.AddDebug();

        var logger = new LoggerConfiguration()
            .MinimumLevel.Verbose()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
            .Enrich.WithExceptionDetails()
            .WriteTo.RollingFile(Configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information,
                outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}) {Message}{NewLine}{Exception}")
            .CreateLogger();

        builder.AddSerilog(logger);
    });

    services.AddMvc();
}

そして、私のloggerFactoryで、このコード行を使用してSerilogを追加しました

loggerFactory.AddSerilog();

私のBuildWebHostメソッドには.UserSerilog()がなく、次のようになります。

public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();

このメソッドは、Program.csのMainメソッドの最後のステップとして呼び出されます。Serilogのドキュメントを読むと、RollingFileのoutputTemplateの{Exception}も例外のスタックトレースをログに記録するはずです。ただし、たとえば、そのようなエラーをログに記録する場合(Microsoft.Extensions.Logging.ILogger

_log.LogError("Exception thrown when trying to convert customer viewmodel to model or getting data from the database with id: " + id, ex);

このログ:

2017-12-12 10:59:46.871 +01:00 [Error] (ProjectName.Controllers.CustomersController) Exception thrown when trying to convert customer viewmodel to model or getting data from the database with id: 137dfdc1-6a96-4621-106c-08d538a26c5b

スタックトレースはありません。しかし、たとえば、.addServicesからのコンストラクター注入によってクラスのコンストラクターにクラスを挿入するのを忘れた場合、スタックトレースはログに記録されます。例えば:

2017-12-12 11:03:23.968 +01:00 [Error] (Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware) An unhandled exception has occurred while executing the request
System.InvalidOperationException: Unable to resolve service for type 'TypeName' while attempting to activate 'ProjectName.Controllers.CustomersController'.
   at Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )

スタックトレースをロギング.txtファイルに表示するにはどうすればよいですか?

9
Jeroen

LogError拡張メソッドには次のオーバーライドがあります。

_public static void LogError(this ILogger logger, Exception exception, string message, params object[] args);
public static void LogError(this ILogger logger, string message, params object[] args);
_

あなたが電話するとき

_log.LogError("Exception thrown when trying to convert customer viewmodel to model or getting data from the database with id: " + id, ex);

実際には2番目のものを使用し、exオブジェクトがフォーマットのパラメーターとして渡されます。メッセージにフォーマット項目がない限り、渡された例外は無視されます。

この問題を解決するには、呼び出しで引数を切り替えるだけです。例外を最初にする必要があります。

__log.LogError(ex, "Exception thrown when trying to convert customer viewmodel to model or getting data from the database with id: " + id);
_
11
CodeFuller