Microsoft.AspNetCore.Hosting.Internal.WebHostおよびlog4net.LogicalThreadContext.Properties ["requestid"]

ecif

私はnetcore2.0を使用しており、ロギングの目的でミドルウェアクラスの各リクエストでlog4net.LogicalThreadContextプロパティ「requestid」を設定しています。

log4net.LogicalThreadContext.Properties["requestid"] = Guid.NewGuid().ToString("N");

ただし、「Microsoft.AspNetCore.Hosting.Internal.WebHost」クラスは、行をログに記録するときにこのプロパティを表示しません。

「Microsoft.AspNetCore.Hosting.Internal.WebHost」のlog4net.LogicalThreadContext.Propery ["requestid"]を設定する方法がわかりません。

すべてのリクエストログを最初から最後まで結びたいと思います。誰かが役立つかもしれない洞察を持っていますか?

よろしく!

更新:ここにコードがあります

using Microsoft.Extensions.Logging;
...

public static ILoggerProvider Log4NetProvider;

public static void Main(string[] args)
    {

#if DEBUG
        Log4NetProvider = new Log4NetProvider("log4net.Debug.config", ((o, 
exception) => exception.Message));
#else
        Log4NetProvider = new Log4NetProvider("log4net.Release.config", ((o, 
exception) => exception.Message));
#endif
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())                
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddProvider(Log4NetProvider);                   
            })
            .ConfigureServices(services =>
            {
                services.AddAutofac();
            })
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();
        host.Run();

Startup.cs Configure(IApplicationBuilderアプリ、IHostingEnvironment env)で、最初に設定しました。

app.UseMiddleware<Log4NetRequestIdMiddleware>();

public class Log4NetRequestIdMiddleware
{
    private readonly RequestDelegate _next;

    public Log4NetRequestIdMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        log4net.LogicalThreadContext.Properties["requestid"] = Guid.NewGuid().ToString("N");
        await _next(context);
    }
}

Log4net構成ファイル>

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="C:\log\applog.log" />
    <rollingStyle value="Size"/>
    <maxSizeRollBackups value="500"/>
    <maximumFileSize value="5MB"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%utcdate|%-5level|%logger|%property{requestid}| %message %exception%newline" />
    </layout>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="RollingFile" />
  </root>
</log4net>

Fileappender.logからの追加の例(RequestIdを太字で示しています)

2018-04-10 14:02:28,664 | INFO | Microsoft.AspNetCore.Hosting.Internal.WebHost | (null) | HTTP /1.1を開始するリクエストGEThttp :// localhost ...
2018-04-10 14:02:28,956 | INFO | Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker | cfb2709e3b4f40559c365ecbb08a7746 | アクションメソッドControllers.HealtCheckStatusController.GetHealthCheckStatus2018-04-10 14:02:29,486 |情報|を実行しています Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor | cfb2709e3b4f40559c365ecbb08a7746 | ObjectResultを実行し、値Microsoft.AspNetCore.Mvc.ControllerContextを書き込みます。
2018-04-10 14:02:29,510 |情報| Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker | cfb2709e3b4f40559c365ecbb08a7746| 実行されたアクションControllers.HealtCheckStatusController.GetHealthCheckStatusin 564.464ms
2018-04-10 14:02:29,520 | INFO | Microsoft.AspNetCore.Hosting.Internal.WebHost | (null) | リクエストは858.9575ms200アプリケーション/ jsonで終了しました。charset = utf-8

AlbertK

WebHostロガーがプロパティを表示しない理由

WebHost ロガーは2つのメッセージをログに記録します-開始メッセージの要求と終了メッセージの要求。

プロパティが設定されているクラスのパイプラインに含まれる最初のミドルウェアの前にメッセージを実行してログに記録するrequestidため、リクエスト開始メッセージにはプロパティが表示されませんWebHostStartuprequestid

requestid(おそらく)WebHostロガーが外れているため、リクエスト終了メッセージにプロパティが表示されませんlog4net.LogicalThreadContextこれは、Log4NetRequestIdMiddlewareロガーがrequestidコントローラーアクションで設定された場合、プロパティを表示しないようなものです

考えられる解決策

WebHostロガーは名前空間HostingApplicationDiagnosticsからクラスのどこかにメッセージを記録するためMicrosoft.AspNetCore.Hosting.Internalrequestidプロパティを設定するコードを挿入するための明確な拡張ポイントはありませんしたがって、WebHostロガーと同じようにミドルウェアに情報を記録できると思います

public async Task Invoke(HttpContext context)
{
    var logger = httpContext.RequestServices.GetRequiredService<ILogger<Log4NetRequestIdMiddleware>>();
    log4net.LogicalThreadContext.Properties["requestid"] = Guid.NewGuid().ToString("N");
    
    var request = context.Request;
    string logMsg = string.Format(
            CultureInfo.InvariantCulture,
            "Request starting {0} {1} {2}://{3}{4}{5}{6} {7} {8}",
            request.Protocol,
            request.Method,
            request.Scheme,
            request.Host.Value,
            request.PathBase.Value,
            request.Path.Value,
            request.QueryString.Value,
            request.ContentType,
            request.ContentLength);
    
    logger.LogDebug(logMsg);

    await _next(context);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ