2017-02-27 18 views
0

以下の問題があります。非同期エンティティのフレームワーク関数は、キャンセルするとTaskCanceledExceptionを生成します。私はこの例外をキャッチし、適切に処理しています。しかし、私は欲しくない例外がまだログに記録されます。処理前のロギング例外

簡体設定:

[HttpGet] 
[Route("page")] 
public async Task<IActionResult> GetPage(
    int? page, int? size, 
    CancellationToken ct) 
{ 
    try { 
     var response = await _mailService.GetPageAsync(page, size, ct: ct); 
     return Respond(response); // Turn service response into HTTP response 
    } 
    catch (OperationCanceledException) { 
     // When reaching here, Exception already logged 
     // If it should be cancelled 
     if (ct.IsCancellationRequested) { 
      // Empty result 
      return new EmptyResult(); 
     } 
     else { 
      // Else raise again 
      throw; // Never reached 
     } 
    } 
} 

私はまた、すべての非同期エンティティフレームワークの操作にCancellationTokenを渡します。エンティティ関数の周りで例外をキャッチしようとしました。

try { 
    page = query.ToListAsync(ct); 
catch(TaskCanceledException){ 
    // When reaching here, Exception already logged 
    return null; 
} 

しかし、同じ動作です。キャッチブロックに入るとすぐに、Exceptionはすでにログに記録されています。ログ記録のために

私はこの構成

var logConfig = new LoggerConfiguration() 
    .MinimumLevel.Debug() 
    .Enrich.FromLogContext(); 
    // Add Sinks 

// Create Logger 
Log.Logger = logConfig.CreateLogger(); 


// Configure() 
loggerFactory.AddSerilog(); 

でSerilogを使用し、異なるこれを処理するか、私がログにTaskCanceledExceptionsを抑制しなければならない方法はありますか?

+1

私は推測していますしかし、私はEFが例外を記録していると思います。 – juunas

+1

ここに表示されています:https://github.com/aspnet/EntityFramework/blob/dev/src/Microsoft.EntityFrameworkCore/DbContext.cs#L351 – juunas

+0

EFをログに記録しないようにするか、グローバルにのみオプションを抑制するようにEFを設定する必要はありますか? – Mats391

答えて

0

からのコメントに基づいて@juunas。あなたはこの方法(その仮想感謝の神)

public class MyDbContext : DbContext 
{ 
    public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, 
     CancellationToken cancellationToken = default(CancellationToken)) 
    { 

     CheckDisposed(); 

     TryDetectChanges(); 

     //remove try catch to throw without logging. 
     return await StateManager.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); 
    } 
} 

は今、あなたを忘れないでください、あなたのレポ内のEFコードの一部を貼り付けたコピーを上書きすることによって、ロギングを非表示にすることができます。つまり、エンティティフレームワークを更新すると、このメソッドのボディが変更された可能性があります。したがって、コードがエンティティフレームワークを破る可能性があります。

警告してください。他の解決策は次のようになりEF

から2つの隠れログ

ソリューションは、すべての設定ログレベルでエンティティフレームワークのエラーをログに記録しないことです:ロギング構成のAppSettings内部Microsoft.EntityFrameworkCore : "None"

{ 
    "Logging": { 
    "LogLevel": { 
     "Microsoft.EntityFrameworkCore": "None" 
    } 
    } 
} 

+0

例外は実際には 'ToListAsync()'から来て、 'SaveChangesAsync()'ではありません。私はSerilogのすべての 'TaskCanceledExceptions'をフィルタリングしました。 – Mats391