首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >log4net.LogicalThreadContext.Properties["requestid"]与Microsoft.AspNetCore.Hosting.Internal.WebHost

log4net.LogicalThreadContext.Properties["requestid"]与Microsoft.AspNetCore.Hosting.Internal.WebHost
EN

Stack Overflow用户
提问于 2018-04-19 11:55:57
回答 2查看 5.2K关注 0票数 3

我使用netcore2.0,并将中间件类中的每个请求设置为log4net.LogicalThreadContext属性"requestid“,以便进行日志记录。

代码语言:javascript
运行
复制
log4net.LogicalThreadContext.Properties["requestid"] = Guid.NewGuid().ToString("N");

但是,"Microsoft.AspNetCore.Hosting.Internal.WebHost“类在记录行时不显示此属性。

我不知道如何将log4net.LogicalThreadContext.Propery"requestid“设置为"Microsoft.AspNetCore.Hosting.Internal.WebHost".

我希望把所有的请求日志从开始到结束。有人有什么有帮助的洞察力吗?

致以问候!

更新:这是代码

代码语言:javascript
运行
复制
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配置(IApplicationBuilder应用程序,IHostingEnvironment env)中,我将其设置为第一件事。

app.UseMiddleware<Log4NetRequestIdMiddleware>();

代码语言:javascript
运行
复制
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配置file>

代码语言:javascript
运行
复制
<?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获取http://localhost. 2018-04-10 14:02:28,956\x\x{e76f}\x{e76f}\x{e76f} Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|cfb2709e3b4f40559c365ecbb08a7746|执行行动方法Controllers.HealtCheckStatusController.GetHealthCheckStatus 2018-04-1014:02:29,486\x\x\x{e76f}\{e76f}\x{e76f}执行ObjectResult,写入值Microsoft.AspNetCore.Mvc.ControllerContext。 2018-04-10 14:02:29,510 INFO INFO Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|cfb2709e3b4f40559c365ecbb08a7746|在564.464 in中执行动作Controllers.HealtCheckStatusController.GetHealthCheckStatus 2018-04-10 14:02:29,520|INFO|Microsoft.AspNetCore.Hosting.Internal.WebHost|(null)|请求在858.9575ms 200应用程序/json中完成;charset=utf-8

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-04 14:09:02

为什么WebHost记录器不显示该属性

WebHost记录器记录两条消息--请求启动消息和请求完成消息。

请求启动消息没有看到requestid属性,因为WebHostStartup类中设置requestid属性的管道中包含的第一个中间件之前运行和记录消息。

请求完成的消息没有看到requestid属性,因为(我猜) WebHost记录器没有log4net.LogicalThreadContext。这就像Log4NetRequestIdMiddleware记录器如果在控制器操作中设置它,就不会看到requestid属性。

可能解决办法

由于WebHost记录器在HostingApplicationDiagnostics类中的某个地方从Microsoft.AspNetCore.Hosting.Internal命名空间记录消息,因此没有任何明确的扩展点来注入将设置requestid属性的代码。因此,我认为您可以像WebHost记录器那样在中间件中记录信息:

代码语言:javascript
运行
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2020-07-24 00:44:56

你可以看看这个https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#logging-providers

创建您自己的LogProvider,像这样清除日志提供程序。

代码语言:javascript
运行
复制
            services.AddLogging(config =>
            {
                config.ClearProviders();
            });

            loggerFactory.AddLog4Net();

本文介绍如何创建log4net日志。https://dotnetthoughts.net/how-to-use-log4net-with-aspnetcore-for-logging/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49920511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档