- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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 app, 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)| Request starting HTTP/1.1 GET http://localhost...
2018-04-10 14:02:28,956|INFO| Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|cfb2709e3b4f40559c365ecbb08a7746| Executing action method Controllers.HealtCheckStatusController.GetHealthCheckStatus 2018-04-10 14:02:29,486|INFO| Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor|cfb2709e3b4f40559c365ecbb08a7746| Executing ObjectResult, writing value Microsoft.AspNetCore.Mvc.ControllerContext.
2018-04-10 14:02:29,510|INFO| Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|cfb2709e3b4f40559c365ecbb08a7746| Executed action Controllers.HealtCheckStatusController.GetHealthCheckStatus in 564.464ms
2018-04-10 14:02:29,520|INFO|Microsoft.AspNetCore.Hosting.Internal.WebHost|(null)| Request finished in 858.9575ms 200 application/json; charset=utf-8
最佳答案
WebHost
记录器不显示属性WebHost
记录器记录两条消息 - 请求开始消息和请求完成消息。
请求开始消息没有看到 requestid
属性,因为 WebHost
在第一个中间件包含到 Startup
类的管道之前运行并记录消息其中设置了 requestid
属性。
请求完成消息没有看到 requestid
属性,因为(我猜)WebHost
记录器在 log4net.LogicalThreadContext
之外。这就像 Log4NetRequestIdMiddleware
记录器不会看到 requestid
属性,如果它在 Controller 操作中设置的话。
自从 WebHost
记录器将消息记录在 HostingApplicationDiagnostics
深处的某处来自 Microsoft.AspNetCore.Hosting.Internal
命名空间的类没有任何明确的扩展点来注入(inject)将设置 requestid
属性的代码。所以,我认为您可以像 WebHost
logger 一样在您的中间件中记录信息:
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);
}
关于c# - Microsoft.AspNetCore.Hosting.Internal.WebHost 和 log4net.LogicalThreadContext.Properties ["requestid"],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49920511/
我正在使用 golang 编写一个网络应用程序。我是这种语言的新手。我试图找到在 golang webapp 中记录 requestid 的最佳方法。我决定使用 go 的日志库 ( https://g
我正在尝试将 requestId 添加到我的网络应用程序的日志中,如图所示 here . public class MDCFilter implements ContainerRequestFilte
我在放入数据库的新创建对象的 id 上收到此空指针异常,即使它应该是自动生成的。 @Entity @Table(name = "REQUEST") @EntityListeners(DatabaseL
chrome.webRequest API 具有请求 ID 的概念(来源:Chrome webRequest documention): Request IDs Each request is ide
我们正在尝试加密我们的有效负载并移动任何不应加密的内容。 到目前为止,这些是我们确定不加密的属性。 -- event.requestContext.requestId -- event.request
Heroku 推出了一个 new labs feature for tracking http-request-id从它的路由器。 一些有用的背景知识:Rails 3.2 推出了一个带有 Tagged
使用 AWS SES 电子邮件验证,在验证电子邮件后,我从响应中得到一个 RequestId。我试图找到一种方法来获取 RequestId 我无法找到可以为我提供此 RequestId 状态更新的端点
我正在开发一个带有 Mpesa 支付模块的 Android 应用程序。我已经能够在媒介上生成本教程指导的 STKPush:https://medium.com/@lentimo/m-pesa-inte
我正在 Google Chrome 扩展中进行开发。在这种环境下,我有能力在请求适当的权限后将 JavaScript 注入(inject)第三方网站。因此,我将代码注入(inject)到引用跨域资源的
我使用 netcore2.0 并在我的中间件类中为每个请求设置 log4net.LogicalThreadContext 属性“requestid”以进行日志记录。 log4net.LogicalTh
我有以下代码用于根据服务调用的响应显示/隐藏成功 div,并且我需要将服务响应的请求传递给成功 Div。如何传递 requestId 并显示成功 div? Success
我想通过 angular2 将文件存储到 azure blob 数据。这样我就创建了一个名为“mysampleoxy”的存储 然后在blob下创建了一个容器“videos”。现在我想将文件从本地服务器
我想通过 angular2 将文件存储到 azure blob 数据。这样我就创建了一个名为“mysampleoxy”的存储 然后在blob下创建了一个容器“videos”。现在我想将文件从本地服务器
我是一名优秀的程序员,十分优秀!