- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
总结一下这个问题,我在一个包中有一个公共(public)类,它在整个项目中使用。该类是一个 Aspect 类,它将值放入 ThreadContext(log4j2) 中,以便我们的日志记录将相应的 session 详细信息写入日志中。
我发现 ThreadContext 的工作方式类似于 ThreadLocal 变量。由于 OSGi 对于每个包都有不同的类加载器,因此 ThreadContext 值的调用者/用户根本无法看到这些值。
引用文献:
Effect of ThreadLocals and side-by-side classloading https://stackoverflow.com/a/34738856/8136561
我期望仍然有一个包含公共(public)代码的包,但其他包仍然能够看到放入 ThreadContext 中的值。我不确定这是否可能。
编辑:添加示例代码
Bundle1 (Common Code)
@Configurable
@Aspect
public class AspectLogger {
@Before("within(@org.springframework.stereotype.Controller *)")
public void beforeControllerAdvice(JoinPoint joinPoint) {
Object[] paramValues = null;
paramValues = joinPoint.getArgs();
Object request = null;
for (Object arg : paramValues) {
if (arg instanceof RenderRequest) {
request = arg;
} else if (arg instanceof ResourceRequest) {
request = arg;
} else if (arg instanceof ActionRequest) {
request = arg;
}
}
if (request != null) {
String transactionID = UUID.randomUUID().toString();
ThreadContext.put("transactionID", transactionID);
}
}
}
Bundle 2,3...n (Using this Aspect as a Bean)
<bean id="aspectLogger" class="shared.bundle.common.AspectLogger" />
Log4j2 configuration using this value for logger appenders (Problem values are empty in the logs)
<PatternLayout>
<Pattern>%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %c{2} (%F:%L) [transactionID: %X{transactionID}] - %m%n</Pattern>
</PatternLayout>
从调试器的角度来看,我可以看到 Controller 的线程和方面的线程基本相同。但我仍然没有得到这些值,我什至在 @Controller
级别尝试了 ThreadContext.get("transactionID")
但它是空的。
最佳答案
所以问题的原因是 log4j 嵌入到每个 war 文件中,然后部署到 OSGi。嵌入的类由相应的包加载。所以它们位于不同的类加载器中。
在 OSGi 中嵌入日志记录是一个坏主意。原因之一是您无法拥有中央日志记录配置。另一个原因就是上面的问题。
您可以将 pax-logging 或 felix logback 支持视为合适的 OSGi 日志记录解决方案。两者都提供 log4j API。
在您的 war files 中然后,您需要定义日志记录 api 包的导入。那么所有的 war 都应该使用来自同一个委托(delegate)类加载器的ThreadContext,并且问题应该得到解决。
关于java - 如何在 OSGi 中实现一个包,该包具有一个将值放入 ThreadContext 的类,以使这些值对其他包可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58177834/
我正在尝试从 log4j-1.x 升级到 log4j-2.3 并在运行时出现以下错误。我缺少什么吗? public void debug(String msg) { appendContext
来自这个答案https://stackoverflow.com/a/25125159/4367326我有 routingAppender 工作,但我想为程序中的每个线程设置 ThreadContext
我有以下控制台附加程序; 问题是我在这里使用的模式输出一个空的 ThreadContext ({})。我不想使用特定的键名称(例如 %X{username}),因为系统非常
我们使用的是 Log4net 的 ThreadContext.Stacks,它运行良好。如果有多个 ThreadContext.Stacks["key"].Push(...),我的问题就来了。 使用简
我已经设置了 ThreadContext.Properties 并且需要在我的代码生命周期中更新它的值。过去我使用过 log4j MDC 并且不得不:MDC.remove(跟踪); 然后通过以下方式添
我的 AsP.NET 站点上运行着 log4net。我可以将消息记录到我的数据库表中,但它没有记录 ThreadContext 属性。例如: ThreadContext.Properties["Url
我正在尝试这个: Type ThreadContextType = typeof(Application).GetNestedType("ThreadContext", System.Reflecti
我一直在做一个使用 log4j2 的项目,在这个项目中我使用了 ThreadContext。现在我回到使用 log4j (1),它不提供 ThreadContext。 ThreadContext 有什
我有以下 Log4J2 配置 XML:
我不明白官方文档中的解释: 逻辑线程可以从一个托管线程跳转到另一个托管线程。 ThreadContext 和 ThreadLogicalContext 有什么区别?有人可以详细说明一下吗? 谢谢。 最
2014 年 11 月 18 日更新 - 在浏览 log4net 源存储库时,我发现 LogicalThreadContext 的实现在 2011 年 11 月被修改为它使用 CallContext.
我正在开发一个 Log4Net 配置,该配置将记录所有未处理的异常。我需要根据用户将某些属性添加到每个日志条目中。我已在 Application_Error 事件中按以下方式成功设置了此设置。这是我完
我只是想知道threadContext.put和MDC.put之间的区别。因为,我相信两者都在做相同的操作。 最佳答案 Log4j 2 continues with the idea of the M
看起来 Class.getResource() 使用 Class 类加载器并忽略 Thread 上下文类加载器,这不是我想要的。关于如何解决这个问题有什么建议吗? 最佳答案 只需获取当前线程类加载器并
有没有人试过同时堆叠context和使用Tasks? 我正在尝试这样的事情: using (log4net.ThreadContext.Stacks["contextLog"].Push("Savin
我想在我的 wcf 服务中使用以下内容在日志消息中记录用户: log4net.ThreadContext.Properties["user"] = this.currentUser.LoginName
在 Web 服务应用程序中,我使用静态方法设置 log4j ThreadContext 变量以进行日志记录,如下所示, public static void setLogParams(String c
总结一下这个问题,我在一个包中有一个公共(public)类,它在整个项目中使用。该类是一个 Aspect 类,它将值放入 ThreadContext(log4j2) 中,以便我们的日志记录将相应的 s
当停止运行我们基于 Wicket-6.19 的网站的 Tomcat 时,大量警告淹没了我们的日志文件: INFO: Stopping service Catalina Jul 06, 2015 8:1
我在一些地方读到 log4net threadContext 在 asp.net 场景中使用不安全。以下是几篇文章: Log4Net, ThreadContext, and Global.asax h
我是一名优秀的程序员,十分优秀!