此时,我们有三个网站,一个开放的api,十个服务,以及我们基础设施的许多其他部分;他们都可以将统计信息发送到队列中。
但是,有一个问题,我们真的想知道这些消息来自哪里,因为我们过去曾遇到过一些问题,如果不可能的话会记录统计数据。
对于网站来说相当简单,我们只需将url插入队列消息中,并拥有一个正则表列表,以确定该URL是否允许使用消息类型。
但是我们如何才能在没有网址的其他应用程序中执行此操作?这些消息有时会在基础架构中非常深入地记录,所有应用程序都可以使用这些消息,因此很难。有人有什么好建议吗?
答案 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概念并且被许多用户使用。
披露:我是该产品的作者。