代码之家  ›  专栏  ›  技术社区  ›  Jan Jongboom

消息记录,找出消息的来源?

  •  1
  • Jan Jongboom  · 技术社区  · 15 年前

    在这一点上,我们有三个网站、一个开放式API、大约十个服务和我们基础设施的许多其他部分;它们都可以向队列发送统计消息。

    但是,有一个问题,我们真的很想知道消息来自哪里,就像我们过去遇到的一些问题一样,在不可能的情况下记录统计信息。

    因为网站相当简单,我们可以将URL插入到队列消息中,并有一个regex列表来确定该URL是否允许消息类型。

    但是,我们如何在没有URL的其他应用程序中执行这些操作呢?消息有时会被记录在基础设施中非常深的地方,这些东西可以被所有应用程序使用,所以这有点困难。有人有什么好建议吗?

    3 回复  |  直到 9 年前
        1
  •  1
  •   Aaron Digulla    15 年前

    它们必须以某种方式连接到队列。这将是一个明确他们身份的完美点。为您的日志记录对象(或队列的连接器)创建一个包装器,这样您就可以存储这些附加信息,并将其预先发送到放入队列的任何消息中。 之前 它被发送了。

    [编辑]回复您的评论:我对类似案例的解决方案:以某种方式传递记录器。在我的例子中,我有几个静态方法,但是我真的需要知道谁使用它们(不是调用它们;这从日志消息中很明显)。

    或者您可以在threadlocal中放置一个令牌:

    String token = "A";
    try {
        pushToken(token);
        ...call method of B...
    } finally {
        pullToken(token);
    }
    
    private static ThreadLocal context; 
    
    public static void pushToken (String token) {
        if (context.get() == null)
            context.set(token);
    }
    
    public static void popToken (String token) {
        if (token.equals (context.get()))
            context.set(null);
    }
    

    这个令牌将在堆栈中一直存在。

        2
  •  0
  •   Aaron Qian    15 年前

    你的网址是正确的。URL代表“ 独特的 资源定位器”。

    你明白我的意思吗?

    给每个日志设施一个唯一的标识符。

    过程A--->Alice

    流程B--->Bob

    等。。。

    您可以这样构造日志:

    [爱丽丝]发生了一些事情。 [鲍勃]又发生了一些事情。

        3
  •  0
  •   Matt user129975    9 年前

    如果您使用的是log4j类型的日志API,那么您可能会对MDC感兴趣。- mapped diagnostic context . 它是专门为这类问题设计的。退房 logFaces -它会让你 easily fish out 实时或通过执行查询获得特定的上下文数据。否则,Aaron提到的threadlocal也似乎是合理的,只是您需要自己编写代码,而不是使用log4j中长期以来和许多用户使用的已证实的MDC概念。

    披露 :我是此产品的作者。