当前位置: 首页 > 知识库问答 >
问题:

使用PostSharp记录具有公共guid的嵌套分布式函数调用

苗冯浩
2023-03-14

目前,多层系统的每个组件都使用PostSharp记录所有函数调用。

e、 g.对WCF服务的应用程序调用可能会提示对DataService(进程中)和AuditService(通过NServiceBus)的调用

Application -> CaseService: getCaseWithAppointments() (via WCF)
  CaseService -> DataService: getCaseById()
  CaseService -> DataService: getCaseAppointments()
  CaseService -> AuditService: logCaseAccess() (via NServiceBus)

这将导致向日志表写入四行,但稍后查看日志表时,无法确定调用logCaseAccess()是作为封闭的应用程序调用的一部分调用的。

如果这四行可以被识别为一个组,那将更加有用。

我可以看到应用程序如何生成一个可以作为参数传递给每个后续调用的Guid,但这不是只有通过更改解决方案中每个函数的签名才能实现的吗?该解决方案已经包括20多个服务,包括200多个运营合同,因此这将是相当大的努力。

是否有一种方法可以修改每个服务,以便它们的每个函数都知道需要一个附加参数(Guid)并将其传递给任何连续的调用(也许使用PostSharp方法边界)?

我读过这篇文章(在Log4Net或NLog(或其他一些记录器)中有没有办法以嵌套的XML或JSON格式输出日志?),但遗憾的是,它没有解决我的需求的分布式(和多线程)性质:

共有1个答案

唐高卓
2023-03-14

如果您只有同步代码,那么在日志中识别调用堆栈的问题通常可以通过在输出中包含当前线程ID来解决。这通常可以在底层日志框架中配置。例如,使用log4net:

<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="[%thread] %message%newline" />
</layout>

如果您使用异步方法,那么您需要使用“逻辑调用上下文”。有一篇有用的文章谈到解决异步方法的类似日志记录问题:http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html

您可以根据需要调整本文中的示例。例如,您可以创建一个OnMethodBoundaryAspect,并在方法条目上保存调用上下文中的GUID(如果还没有)。由于标准PostSharp日志记录不会在调用上下文中使用自定义GUID,因此您需要自己在方面中进行日志输出。

[Serializable]
public class TestAspect : OnMethodBoundaryAspect
{
    private const string Name = "LogId";

    public TestAspect()
    {
        this.ApplyToStateMachine = true;
    }

    public override void OnEntry(MethodExecutionArgs args)
    {
        object contextId = CallContext.LogicalGetData(Name);
        if (contextId == null)
        {
            contextId = Guid.NewGuid().ToString();
            CallContext.LogicalSetData(Name, contextId);
        }

        // Build the log message and send the output to the underlying framework
        Console.WriteLine("{0}: {1}", contextId, args.Method.Name);
    }
}
 类似资料:
  • 问题内容: 我有以下代码: 有什么方法可以在函数外部调用函数?我试过调用,但我认为它仅在父函数内部可见。 问题答案:

  • 我正在尝试使用PostSharp和multicastAttribute实现日志记录。使用PostSharp诊断库中的日志功能。 我有一个GlboalAspects。启动项目目录中的cs。内容如下。 右键单击我的项目并选择属性,默认命名空间是“alp_generator” 我不知道“PostSharp.Patterns.Diagnostics.LogAttribute”是否正确。 我根本没有日志记录

  • 问题内容: 我有一个方法,我已经分解成一些较小的嵌套函数来分解代码库: 有没有一种方法可以单独运行其中一个嵌套函数。例如: 编辑: 我正在尝试在使用pyramid_breaker构建的Web服务器上设置缓存 这是我的理解可能不准确: 现在我有这个原因是因为装饰器用来创建缓存键的名称空间是从函数和争论中产生的。因此,您不能仅将装饰器放在getThis上,因为请求变量是唯一的,并且缓存是无用的。所以我

  • 本文向大家介绍JavaScript中的函数嵌套使用,包括了JavaScript中的函数嵌套使用的使用技巧和注意事项,需要的朋友参考一下  在JavaScript1.2之前,函数定义是只允许在顶层全局代码,但1.2的JavaScript可以嵌套函数定义其他函数中也是可以的。 仍然存在的函数定义可以循环或条件之内不会出现限制。在函数定义这些限制只适用于函数声明与函数语句。 函数文本(在JavaScri

  • 我想使用mutate对嵌套/分组数据集的每组应用一个函数。这个例子应该有助于解释目标。需要关于如何正确编码的建议。 接下来我们做一个函数来拟合这个数据的生存曲线。 最后,我们将该函数应用于分组数据的每一行,并使用purrr::map和dplyr::mutate将结果保存为分组tibble中的一个新列。 我希望在本例中得到的结果是具有以下特征的嵌套Data.Frame: null 布兰特

  • 问题内容: PHP中有一个非常糟糕的限制:如果您调用某个调用a2()的函数a1(),又调用了a3 …,那么何时调用将看到 致命错误:达到最大功能嵌套级别‘100’,正在中止! 有什么方法可以将100个嵌套调用的限制增加到500或10000吗? 这对我来说至关重要,因为我正在开发一个带有很多回调的基于事件的系统。 问题答案: 此错误消息专门来自XDebug扩展。PHP本身没有函数嵌套限制。更改php