当前位置: 首页 > 知识库问答 >
问题:

Java-为多个线程创建日志记录上下文

南宫兴德
2023-03-14

我目前正在研究事件/activity日志记录系统,我正在使用方法拦截器将其作为一个方面来实现。目前,系统/框架假定每个方法都是一个activity,但我想对此进行扩展,以便一个activity可以跨越多个方法调用。为了做到这一点,首先想到的方法是为所有相关的方法调用提供一些上下文。但是,我只知道在所有方法调用都在单个线程的上下文中(像Log4j的MDC/NDC)时这样做的方法。是否有任何方法为多线程提供上下文(可能在代码不知道多线程的情况下)?

共有2个答案

萧业
2023-03-14

类ThreadLocal?这样的SEM实际上可能是对TLS的一种有效和合理的使用--将cotext添加到已经存在的代码中。

姚臻
2023-03-14

不要想着“伐木”。它涉及到更基本的内容:如果您希望多个线程执行的操作在同一上下文中处理,那么您要传播什么内容来让每个线程知道它们在哪个上下文中?

如果您能回答这个,那么这个上下文就是您需要放入MDC/NDC中进行日志记录的内容(很可能不是整个上下文,而是那个上下文中的一些关键信息)。

如果您的应用程序不携带这些信息,那么任何人都无法为您确定这些信息。

编辑:

我可以给你一些关于如何执行设置的想法。使用AOP来进一步增强它是否合适,那是您的进一步研究:)

// Assume I have a ContextManager which Context is stored in thread local:

abstract class ContextAwaredJob implements Runnable {
  public ContextAwaredJob() {
    this.context = ContextManager.getCurrentContext();
  }
  public void run() {
    ContextManager.setCurrentContext(this.context);
    doRun();
  }
  protected abstract void doRun();
}

您的新“作业”将扩展这个父类,如果您正在由另一个线程运行,则上下文将自动设置。(当然,设计可以做很多改进,但它能让你对正在发生的事情有一个基本的认识)

 类似资料:
  • 我有以下控制台附加器; 问题是我在这里使用的模式输出了一个空的ThreadContext()。我不想使用特定的密钥名称(例如,),因为系统非常广泛,密钥集也不同。示例输出: 2017-09-26 10:39:55396[main]信息:启动内部HTTP客户端{}

  • 虽然很清楚如何配置多线程jBehave run,但我不清楚如何处理日志记录混乱。 这里有哪些选项?

  • 我目前正在创建一个系统,可以有模块(把它们看作插件),其中每一个都可以有自己的日志,专用的。 我想使用log4j2项目进行日志记录,但我似乎在文件附加符方面遇到了一些麻烦。 主项目(模块加载器和整个事情的“核心”)应该有自己的日志文件,而模块应该有自己的日志文件(像)。 即使搜索也没有给我提供任何接近的解决方案,我找到的只是xml配置中预定义的文件日志--这不是我想要的。 感谢你的阅读;即使是最轻

  • 问题内容: 我想使用Java util日志记录按照以下格式为每个请求创建日志文件。 有人请告诉我如何使用Java util日志记录来实现这一目标? 问题答案: 该文件处理器不支持通过生成的文件名的日期和时间从日志管理。 如果要在启动时生成文件名,则可以将FileHandler子类化,并创建一个静态方法来使用SimpleDateFormat生成文件名。该日志管理支持“配置”选项,也将让您安装自定义代

  • 问题内容: 我有一个JAVA类,用于启动具有唯一ID的各种线程。每个线程应登录到一个唯一的日志文件中,该文件以ID.log命名。 因为我仅在运行时获得唯一ID,所以我必须以编程方式配置Log4J: 现在,如果我按顺序启动作业,此方法就可以正常工作- 但是,当我同时启动2个线程(同一类)时,会创建两个日志,但日志混合在一起:第二个线程同时登录第一个和第二个日志。 我如何确保每个实例都是唯一的?我已经

  • 我想登录由几个类组成的应用程序。我想要一个。txt日志文件的末尾。因此,我创建了一个静态记录器实例,并在一个类中为其创建了一个FileHandler。因为我想要一个文件,所以我在FileHandler中将第二个参数设置为true,以便能够在日志记录期间追加日志文件。 之后,我创建了其他伐木工人。我知道我必须为每个类实例化一个记录器。因此,我只为每个类创建记录器(不带FileHandler)。但是所