6K Star 11.8K Fork 4K

GVPdotNET China / Furion

 / 详情

日志上下文的问题

已完成
创建于  
2022-10-31 21:28

💢 特别说明:如果 Issue 没有严格按照模板编写且未提供测试源码下载或 Git 测试仓库地址,则视为无效 Issue,将无法得到答复。

Furion 版本号

4.7.2


.NET SDK 版本号

  • .NET5
  • .NET6
  • .NET7

Web 项目类型

  • WebApi
  • Mvc
  • Razor Pages
  • Blazor Server
  • MinApp

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;
        }
    }

Demo代码下载地址:
https://gitee.com/lxdlt/test-exception-logging.git

期待的结果是?


评论 (11)

lxdlt 创建了任务
lxdlt 修改了描述
展开全部操作日志

收到,明天早上测试,辛苦了。

首先你的例子也是非常奇葩的写法。

设置日志上下文又不写日志,而且日志上下文的键又一模一样,这里本身就是错误的,因为日志上下文每次操作都会清空。

输入图片说明

第二个问题,在可以依赖注入的地方没用依赖注入,而且设置了上下文也没有释放

输入图片说明

还有,就是你的启动层命名空间都是 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

咨询一下,是否还有其它办法,能在异常日志的上下文中添加 额外数据?

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
974299 monksoul 1578937227
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助