Issue
,将无法得到答复。4.7.2
public class IndexModel : PageModel
{
public readonly ISystemService _systemService;
public readonly ILogger<IndexModel> _logger;
public IndexModel(ISystemService systemService, ILogger<IndexModel> logger)
{
_systemService = systemService;
_logger = logger;
}
public void OnGet()
{
_logger.LogInformation("正常日志记录");
ViewData["Description"] = _systemService.GetDescription();
//触发异常
throw new Exception("测试异常状态日记记录");
}
}
public class ExceptionLogFilter : IAsyncExceptionFilter
{
public async Task OnExceptionAsync(ExceptionContext context)
{
Furion.Logging.Log.ScopeContext(ctx =>
{
//给日志上下文添加额外数据
ctx.Set("TestContextData", "---来自ExceptionFilter的测试数据!---");
});
await Task.CompletedTask;
}
}
internal class DatabaseLoggingWriter : IDatabaseLoggingWriter
{
public void Write(LogMessage logMsg, bool flush)
{
Console.WriteLine("上下文额外数据是:{0}", logMsg.Context.Get("TestContextData"));
return;
}
}
我想在ExceptionFilter中给日志上下文附加数据,然后在DatabaseLoggerWriter中写入数据库。但到了DatabaseLoggerWriter logMsg.Context为空值。
正常的日志通过PageFilter附加数据没有这个问题。
internal class RazorPageLogFilter : IAsyncPageFilter
{
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
Furion.Logging.Log.ScopeContext(ctx =>
{
//给日志上下文添加额外数据
ctx.Set("TestContextData", "来自PageFilter的测试数据!");
});
await next.Invoke();
}
public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
{
return Task.CompletedTask;
}
}
期待的结果是?
收到,明天早上测试,辛苦了。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
首先你的例子也是非常奇葩的写法。
设置日志上下文又不写日志,而且日志上下文的键又一模一样,这里本身就是错误的,因为日志上下文每次操作都会清空。
第二个问题,在可以依赖注入的地方没用依赖注入,而且设置了上下文也没有释放
还有,就是你的启动层命名空间都是 TestExceptionLogging
,那么这里在启动层写日志永远返回 true
,那么没有设置上下文的自动会报错。
最后结论,这不是框架的错误,而是自己业务代码的错误。
但是你也带给框架一个”惊喜“,万万没想到有人设置了日志上下文,但是不写日志的骚操作!!!,所以下个版本框架将杜绝这样的做法。
还有一个问题:你在 IndexModel
中初始化的 ILogger<IndexModel>
对象和 RazorPageLogFilter
中使用的 Furion.Logging.Log.ScopeContext
设置上下文返回的 ILogger
对象不是同一个对象。是两个不同的 ILogger
对象,他们的日志上下文是不通用的。
你好,我的目的是:
1、使用者在进行一些关键环节的操作时可以将操作的一些细节通过日志到数据库。
2、如果系统发生异常也可以将发生异常的细节通过日志保存到数据库。
services.AddDatabaseLogging<DatabaseLoggingWriter>(options =>
{
options.WriteFilter = (logMsg) =>
{
return logMsg.LogLevel >= LogLevel.Error || logMsg.LogName.Contains("TestExceptionLogging");
};
});
所以需要筛选掉System和Microsoft的日志信息,只保留 Error 以上和 程序自己的日志信息。
另:
想在记录日志时,能获取到 记录点的 HttpContext.Request 中的一些信息。目前想到的办法是通过PageFilter 和 ExceptionFilter 获取request的数据。我刚刚测试都使用 ILogging注入,但是结果原先的一样:
通过PageFilter设置的上下文在写入时正常。
通过ExceptionFilter设置的上下文就为空。
v4.7.3 版本发布:#I5Z9TI:📝 发布 Furion v4.7.3 版本
登录 后才可以发表评论