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

时间:2009-08-28 08:38:56

标签: logging statistics

此时,我们有三个网站,一个开放的api,十个服务,以及我们基础设施的许多其他部分;他们都可以将统计信息发送到队列中。

但是,有一个问题,我们真的想知道这些消息来自哪里,因为我们过去曾遇到过一些问题,如果不可能的话会记录统计数据。

对于网站来说相当简单,我们只需将url插入队列消息中,并拥有一个正则表列表,以确定该URL是否允许使用消息类型。

但是我们如何才能在没有网址的其他应用程序中执行此操作?这些消息有时会在基础架构中非常深入地记录,所有应用程序都可以使用这些消息,因此很难。有人有什么好建议吗?

3 个答案:

答案 0 :(得分:1)

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

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

或者您可以在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);
}

该令牌将在堆栈中存活下来。

答案 1 :(得分:0)

您使用网址走在正确的轨道上。 URL代表“唯一资源定位器”。

你明白我的观点吗?

为每个日志记录工具提供唯一标识符。

过程A --->爱丽丝

过程B --->鲍勃

等...

您可以像这样构建日志:

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

答案 2 :(得分:0)

如果您正在使用log4j品种的日志记录API,您可能会对查看MDC感兴趣 - mapped diagnostic context。它专为此类问题而设计。查看logFaces - 它会实时或通过查询让您easily fish out特定的上下文数据。否则,Aaron提到的ThreadLocal似乎也是合理的,只是你必须自己编写代码,而不是长时间使用log4j中使用的MDC概念并且被许多用户使用。

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