问题标签 [mdc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
491 浏览

asynchronous - 如何将请求过滤器中设置的 MDC 值与 apache camel 线程池一起使用?

我目前面临的问题是我的日志提供了虚假信息。为一个请求设置的 MDC 值与其他请求生成的日志一起记录。

我知道这个问题正在发生,因为我在我的场景中使用骆驼并行处理。有没有其他人遇到过类似的问题,它是如何解决的?

使用 apache camel 处理 Web 请求时,这似乎是一个常见问题,但我在 Web 上没有看到足够的信息。

我将非常感谢这方面的任何帮助。谢谢

0 投票
3 回答
3089 浏览

scala - Akka 拦截具有可堆叠行为的接收

Akka 和 Scala 新手在这里,请随时根据需要编辑问题,以便清楚地表达我在 Scala 和 Akka 领域的意图。

在展示代码片段之前,我要解决的问题是:我本质上想开发一个通用模块供我的团队在使用 Akka Actor 开发应用程序时使用。我想让他们混合一个特征,这将在运行时扩展他们的接收功能,主要用于日志记录。我遇到了编译错误,我很快就会解释。

但首先,以一个简单的 main 为例:

这是一个团队成员可能在其应用程序中实现的参与者的示例实现:

这是一个示例,说明我将如何为他们提供一个共同的特征来混合:

如您所见,如果消息恰好是字符串,我正在尝试将数据添加到 MDC(一个基本示例,实际上,我会检查我们自己的一些自定义类型)。

我得到的错误是:

这里有什么问题?可堆叠的特征是否有权离开以实现这样的目标?如果没有,最惯用的方法是什么?

更一般地说,除了“拦截器”模式之外,这里是否应用了另一种模式?

感谢所有的帮助!

0 投票
1 回答
2941 浏览

scala - Scala Akka 使用 SLF4J MDC 进行日志记录

我正在配置我的 Akka 应用程序以使用此处指定的 SLF4J 记录器:

http://doc.akka.io/docs/akka/2.3.4/scala/logging.html

在引擎盖下,我依靠 Logback 来进行日志记录。我正在开发一个用于记录目的的通用模块,用户可以在其参与者系统中使用该模块。主要是,我正在创造一个他们可以混合的特征。

我有一个特点:

我有这样的东西:

我有一些额外的逻辑会将 MDC 值添加到 DiagnosticLoggingAdapter 的 MDC。现在的问题是:如果用户想要混入他们的非参与者类,我会完全公开一个不同的记录器。所以我可能有这样的事情:

我希望 MDC 值能够延续到此记录器。例如,如果我将 MDC 值放入我的 DiagnosticAdapterLogger,我应该期望能够从 org.slf4j.MDC 中获取这些值

如何以干净的方式实现这一目标?

谢谢!

0 投票
0 回答
95 浏览

cluster-computing - JBoss6 上的 MDC 混合会话数据

在使用 MDC 时,我们在 JBoss 6.1 中有一个非常奇怪的行为。我们的应用程序是一个 SOAP Web 服务,在连接到该服务后,我们会生成一个唯一的事务 ID,我们在 MDC 中设置该事务 ID 用于记录日志。
现在,当我在本地计算机上以独立模式运行服务器时,这可以正常工作。它似乎在属于两服务器集群的另一台服务器上工作正常。另一台机器不能正常工作。然后我们在同一个集群中还有六台服务器无法正常工作。

发生的情况是 MDC.put 设置的唯一事务 id 在线程之间混淆了。一旦新客户端连接到服务并获得新的事务 ID,所有其他活动会话都会获得相同的事务 ID。当会话结束并且我们从该会话中删除 MDC 事务 id 时,它会从所有活动会话中删除。

我完全不知道如何解决这个问题,因为我无法在我的本地机器上重现这个问题。在有两台机器的集群中,一台工作,另一台不工作,我在 JBoss 配置中可以找到没有区别。

有没有人对如何追踪问题的实际问题有任何建议?

谢谢

0 投票
1 回答
4007 浏览

regex - Logback 替换正则表达式以检测空值

我正在尝试使用 logback 的替换功能来不在我的 MDC 日志模式中打印空值。 http://logback.qos.ch/manual/layouts.html#replace

我正在尝试从这里 http://logogin.blogspot.com/2013/04/logback-mdc-and-empty-values.html遵循一个示例

一些背景

在 90% 的时间里,我的日志模式都会打印

在 5% 的时间内打印

这是因为在后一种情况下不需要在 MDC 上提供 emp 和 org。对于这些情况,我希望 emp: 和 org: 根本不存在于日志行中。

期望的

替换的可能解决方案

这是我的变量和我正在使用的附加程序。这个想法是 mdcPattern 将解析为没有 emp 和 org 值的空字符串。

但是替换正则表达式不起作用。我将日志行视为:

我的正则表达式有点弱。我似乎无法理解为什么替换模式会出现在我的日志行中。任何帮助是极大的赞赏。

0 投票
1 回答
95 浏览

java - 我们可以在 JAVA 中使用 MDC 进行非日志记录吗

MDC.put('item', 'xxxx') MDC.get('item')

谢谢希夫

0 投票
1 回答
1902 浏览

web-applications - Log4j2:无法使用 Servlet 上下文侦听器设置 MDC 键

我正在尝试使用 Servlet 上下文侦听器将主机名设置为 MDC 变量。MDC 变量仅在侦听器本身中可用,但如果我尝试从其他 servlet 登录,它就会消失。

这是我的监听器代码:

这是我的 web.xml:

有什么建议吗?谢谢。

0 投票
1 回答
727 浏览

java - 并行测试中的控制台输出显示在不同的测试树中,而不是在

我在 Intellij IDEA 13.4、logback 1.1.2 中使用 TestNG 6.8.8。我有一堆测试类,并且有这样的 xml 启动器:

此外,每个类都有不同测试类的 MDC 标记:

和 logback.xml:

当我将 xml runner 更改为 thread-count="1" 时,一切都很好 - 控制台将每个测试记录在它自己的树节点中。

但是当我使用 thread-count="3" 或更多运行 TestNG 时,一些日志条目不会显示在他们自己的测试树节点中,而是显示在其他一些日志条目中。

例如,测试“test1”的树节点中的控制台输出可以是:

因此,ExampleClass2 类的日志条目显示为 ExampleClass1 的执行结果,而测试“test2”的树节点中的控制台输出为空。此外,控制台输出的 xml 导出显示,一些日志值用于不同的测试结果。

Intellij 如何为每个测试负责的输出线设计?有没有办法强制 Intellij IDEA 以某种方式检查哪个日志条目哪个类由 MDC 标记负责?还是有任何其他方法可以确保控制台输出位于测试树中?

0 投票
3 回答
4886 浏览

java - SLF4J MDC Memory Leak

I've had a google for this, looked at multiple suggestions and nothing seems to help.

I have a JAX-RS application which using MDC, when an endpoint is hit sets a transactionId in order to make debugging easier. However, when i stop or restart Tomcat the logs are filled with entries like this:

27-Sep-2014 09:42:14.858 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/core-1.0.0-RC2] created a ThreadLocal with key of type [org.apache.log4j.helpers.ThreadLocalMap] (value [org.apache.log4j.helpers.ThreadLocalMap@464437fc]) and a value of type [java.util.Hashtable] (value [{siteCode=000tst, transactionId=dc8f3a1b-1d7a-4f91-abf6-58d015632d03}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

I have a RequestFilter where MDC is called:

These are my sl4fj dependencies:

If I have a ResponseFilter with MDC.clear() It removes the values from the MDC, but doesn't seem to clear the thread:

27-Sep-2014 09:12:58.216 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/core-1.0.0-RC2] created a ThreadLocal with key of type [org.apache.log4j.helpers.ThreadLocalMap] (value [org.apache.log4j.helpers.ThreadLocalMap@391216c7]) and a value of type [java.util.Hashtable] (value [{}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

Apparently it was fixed in log4j 1.2.17 but the changes don't seem to have filtered through to slf4j.

0 投票
1 回答
1184 浏览

java - log4j FileAppender 是线程安全的吗?我可以即时更改文件名吗?

我运行一个部署在 Tomcat 中的 Java webapp。我们commons-logging用作包装器log4j v1.2.16

我们有许多并发请求访问服务器,并且不希望调试/跟踪记录每个请求。但是,对于某些用户,出于调试原因,我们希望跟踪他们的交易。我们维护一个列表,从数据库驱动,其中用户要跟踪。当请求命中时,我们检查我们的列表以查看是否应该跟踪。

他们在 GET 字符串中传递他们的用户名,我们可以毫无问题地得到它,将其添加到 中MDC,然后通过ConversionPattern.

我们现在希望为我们跟踪的每个用户创建一个文件,我对此的解决方案是创建一个RollingFileAppender所有日志记录都指向的自定义扩展。

如果日志级别是trace我们检查MDC.get("traceOn")是否应该输出。

然后我执行以下操作(肮脏的示例):

我知道 MDC 是基于每个线程的,但是在生产中运行它是否安全,有 10 个并发线程日志记录并可能写入它们自己的文件?

如果不是 - 我怎么能实现同样的事情 - 基于 MDC 写入多个日志文件(我们是否应该记录,如果是,则使用文件名)?