- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的网站中,我正在集成 Serilog 以将我的错误记录到自定义接收器中。 LogContext 丰富了日志记录,其中需要传递一些自定义属性。如果我使用 Log.Information(),它会使用 LogEvent 中的属性到达我的接收器。所以这很好用。
主要目的是将日志系统与异常处理程序中间件结合起来。所以在异常处理程序中,错误被捕获,这是从 Controller 方法抛出的。我将 _logger.Log() 放在异常处理程序中的任何地方,Sink 中都没有可用的自定义属性。在调试时,它在进入 Sink 之前通过了 LogContextFilter,但没有找到过滤器的属性。
有没有人有任何想法?
创业
Log.Logger = new LoggerConfiguration()
.WriteTo.PasSink(new SerLogServiceClient.SerLogServiceClient(new SerLogServiceClientOptions()))
.Enrich.FromLogContext()
.CreateLogger();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddMvcOptions(mo =>
{
mo.Filters.Add(typeof(LogContextFilter));
});
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<LogContextMiddleware>();
app.UseErrorHandler(o =>
{
o.ExceptionHandlingPath = "/Home/Error";
o.Context = ExceptionHandler.Context.MVC;
});
//app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "Content")),
RequestPath = "/Content"
});
app.UseAuthentication();
app.UseSession();
//app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
using (LogContext.Push(
new PropertyEnricher("UserCode", context.HttpContext.User.Claims.FirstOrDefault(s => s.ToString().StartsWith("UserCode"))?.Value),
new PropertyEnricher("Test", "Will this go through?")))
{
await next.Invoke();
}
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (HttpRequestException hex)
{
//check response naar reynaersexception??
//deserialize naar re
throw new NotSupportedException(); //als test
}
catch (Exception ex)
{
if (context.Response.HasStarted)
{
throw ex;
}
_logger.LogError(ex.Message);
var originalPath = context.Request.Path;
try
{
if (_options.Context == Context.MVC)
{
context.Response.Clear();
context.Response.StatusCode = 500;
context.Response.OnStarting(Callback, context.Response);
//set features
var exceptionHandlerFeature = new ReynaersExceptionHandlerFeature()
{
Error = ex,
Path = context.Request.Path.Value,
};
context.Features.Set<IExceptionHandlerFeature>(exceptionHandlerFeature);
context.Features.Set<IExceptionHandlerPathFeature>(exceptionHandlerFeature);
//continue lifecycle with updated context
if (_options.ExceptionHandlingPath.HasValue)
{
context.Request.Path = _options.ExceptionHandlingPath;
}
await _next.Invoke(context);
}
}
catch (Exception ex2)
{
// Suppress secondary exceptions, re-throw the original.
Log.Error(ex2.Message);
context.Request.Path = originalPath;
throw ex;
}
}
}
最佳答案
发生这种情况是因为异常记录在运行于 using (LogContext.Push(..))
之外的处理程序中。 ,因此自定义属性已经脱离了上下文。
...
// in mvc's OnActionExecutionAsync()
using (LogContext.Push(
new PropertyEnricher("UserCode", ".."),
new PropertyEnricher("Test", "Will this go through?")))
{
await next.Invoke(); // code that throws
}
...
// later in ExceptionHandlerMiddleware, no custom properties
_logger.LogError(ex.Message);
前段时间研究这个问题,写了
ThrowContextEnricher .
Log.Logger = new LoggerConfiguration()
.Enrich.With<ThrowContextEnricher>() // Adds enricher globally
.Enrich.FromLogContext()
.WriteTo
...
.CreateLogger();
...
// in mvc's OnActionExecutionAsync()
// push your properties as normal
using (LogContext.Push(
new PropertyEnricher("UserCode", ".."),
new PropertyEnricher("Test", "Will this go through?")))
{
await next.Invoke(); // code that throws
}
...
// in exception handler
// properties get logged now
// notice the exception is passed too, not just message
_logger.LogError(ex, ex.Message);
关于c# - Serilog Logcontext 属性在异常处理程序之后消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55223744/
我正在寻找一种为 serilog 提供独立 XML/JSON 配置文件的方法,该文件是从应用程序本身运行的目录中动态加载的。 我正在寻找类似的东西 NLog provides .如 Nlog#Conf
我在我的 aspnet core 应用程序中使用 Serilog 进行日志记录。我需要频繁地将日志事件写入控制台(每秒 300-500 个事件)。我在 docker 容器内运行我的应用程序,并使用 O
是否可以创建一个自动为每条消息添加前缀的记录器? 我通常在每条消息前加上帐户前缀,因为这样更容易阅读,像这样: user1 - did something user2 - did another th
我具有动态更改日志文件路径的功能。但是,当我更改 Consul 中可配置的路径时,它会在两个地方(即旧路径和新路径)写入部分日志。更改日志文件路径应该可以在没有任何服务重启的情况下工作。我们如何存档?
我有很多这样的日志: Log.Information("Submitting order {@order}", order); 此日志通过 RabbitMq -> LogStash -> Elasti
我有很多这样的日志: Log.Information("Submitting order {@order}", order); 此日志通过 RabbitMq -> LogStash -> Elasti
我在服务器端使用 Serilog 为我所有的 .NETCore 服务使用控制台、文件和 Graylog 接收器。我也喜欢在我的 Windows 胖客户端(WPF 应用程序)中使用它。 与 后者我有问题
我正在使用 Serilog.Extensions.Logging 并使用此 outputTemplate 输出到控制台: "{Timestamp:HH:mm} [{Level:u3}] {Messag
Date时间的RollingFile Sink的当前输出如下 2015-04-06 18:40:54.400 +10:00 [Information] Hello World! 无论如何,有没有要消除
我使用 Serilog 作为 .NET 的库,它为文件、控制台和其他地方提供诊断日志记录。 我的问题是我在我的代码中声明了一些日志记录事件,但是在查看 Windows 事件查看器时,分配给我的日志的事
Serilog 的 Azure 表存储接收器是否可以像其他接收器(例如 Elasticsearch 和 Seq)一样通过 app/Web.config 配置,这些接收器可以从配置文件进行配置。 Azu
我正在使用 SeriLog 登录基于 IdentityServer3 的身份验证服务。我刚刚将 serilog.sinks.literate 插件替换为 serilog.sinks.file 插件,以
我使用 Serilog 作为 .NET 的库,它为文件、控制台和其他地方提供诊断日志记录。 我的问题是我在我的代码中声明了一些日志记录事件,但是在查看 Windows 事件查看器时,分配给我的日志的事
我正在尝试安装 serilog,但出现错误 PM> Install-Package Serilog Install-Package : 'Serilog' already has a dependen
从 nlog 转移到 serilog,我希望我的 .NET 框架桌面应用程序在每次运行时重用一个静态命名的日志文件,但在每个新进程中清除文件的内容。可以这样配置serilog吗? This is a
serilog 的可用接收器位于此处:https://github.com/serilog/serilog/wiki/Provided-Sinks 但不包括蔚蓝服务巴士。 目前是否正在努力创建一个?如
我要写 Serilog Warning .NET 集合中的事件,以便它们可以包含在给用户的报告中。我该怎么做 configure the static Log.Logger 写信给类似 static
我尝试在结构化模式下将 JSNLog 与 Serilog 一起使用,如文档中所述: http://jsnlog.com/Documentation/HowTo/StructuredLogging 我在
我正在从 log4net 切换到 Serilog,但错过了我在 log4net 中的一些格式化可能性。我没有找到关于我可以在 outputTemplate 中使用哪些格式化程序的任何文档。有什么方法可
我远不是具有任何 .net 经验的开发人员,但工作中的开发团队希望使用 Serilog 和 serilog-sinks-elasticsearch 将日志推送到我的 ELK 堆栈中。 查看 seril
我是一名优秀的程序员,十分优秀!