ASP.NET Core Web API でログ記録のために HTTP 要求をキャプチャするのが困難です。ここで例を見つけることができました
http://dotnetliberty.com/index.php/2016/01/07/logging-asp-net-5-requests-using-middleware/
これは役に立ちました。これは基本的に、ミドルウェア機能を使用して HTTP 要求パイプラインに追加されるログ クラスです。問題は、クラス メソッドがアプリケーションの起動時にのみ呼び出されることです。get または post http リクエストで呼び出すことができません。コンソール アプリケーション内で Fiddler と http クライアントを使用してみましたが、デバッグが可能で、応答が正常であるため、get または post http 要求が機能しています。
これが私のロギングクラスです
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace CoreWebAPI.Models
{
public class RequestLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<RequestLoggingMiddleware> _logger;
public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task Invoke(HttpContext context)
{
var startTime = DateTime.UtcNow;
var watch = Stopwatch.StartNew();
await _next.Invoke(context);
watch.Stop();
var logTemplate = @"
Client IP: {clientIP}
Request path: {requestPath}
Request content type: {requestContentType}
Request content length: {requestContentLength}
Start time: {startTime}
Duration: {duration}";
_logger.LogInformation(logTemplate,
context.Connection.RemoteIpAddress.ToString(),
context.Request.Path,
context.Request.ContentType,
context.Request.ContentLength,
startTime,
watch.ElapsedMilliseconds);
}
}
}
そして、これが Startup.cs クラスの Startup.Configure メソッドです。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
app.UseCors(builder => builder.AllowAnyOrigin());
app.UseMiddleware<RequestLoggingMiddleware>();
}
最後の行では、app.UseMiddleware を使用して HTTP 要求に便乗しています。これはうまくいくはずだと思いますが、うまくいかない理由や別の方法を知っている人がいれば、それは素晴らしいことです。追加情報を提供する必要がある場合はお知らせください。