【问题标题】:logging specific function-calls to specific logs将特定函数调用记录到特定日志
【发布时间】:2013-01-01 11:24:32
【问题描述】:

我有一个 Java 服务器(基于 Java 的 Socket.IO,但这不是问题的一部分),它接受来自 Web 客户端的请求,进行一些计算,并将结果发回给它们。

服务器使用一些库,它们使用 log4j 进行日志记录。

由于计算很长,我想发送给客户,不仅是最终结果,还有日志。

我当然想发送每个客户端,只发送与其请求相关的日志行。

所以,我的问题是:如何配置 log4j,以便在特定函数调用期间生成的所有日志都转到特定记录器?

【问题讨论】:

  • 这听起来不太可能,因为 Log4J 无法提前知道它必须将日志写入的文件描述符。看起来它只能以编程方式完成,但 log4j API 也有相应的工具。
  • 好的,那么我怎样才能以编程方式做到这一点,同时保持我的应用程序多线程?

标签: java logging log4j


【解决方案1】:

是的,有可能。 首先,您需要熟悉 MDC(映射诊断上下文)的概念 - 基本上它是一个用于存储内容的每个线程的日志记录上下文(读取 - 哈希图)。 log4j 可以配置为根据 MDC 值将日志输出发送到不同的目的地 - 因此您可以将每个用户的日志输出发送到以用户命名的文件。因此,您要做的是在开始长操作时在 MDC 中设置用户名(或某些标识符),所有操作的日志记录都将进入特定位置(文件,取决于配置的记录器),然后清除 MDC当操作完成时。

有使用 MDC herehere 的两部分教程。
理想情况下,我也会为此目的编写自己的 log4j 记录器,如下所示:Using MDC in log4j to dynamically name the log file

【讨论】:

  • "在开始长操作时在 MDC 中设置用户名(或某些标识符),所有操作的日志记录将进入特定位置(文件,取决于配置的记录器)然后清除操作完成后的 MDC”但这意味着我不能并行运行该长操作的两个实例(在两个工作线程中)?
  • 当然可以 - MDC 是线程本地的,因此如果您为 2 个不同的用户进行 2 次 TX,则日志记录将转到不同的文件。如果您希望单个 TX(针对单个用户)执行线程,则需要将 MDC 转移到您创建的每个新线程。如果您希望在同一用户下并行(不相关)2+ TX,则需要将 user + 一些唯一的 TX id 放入 MDC 并编写您自己的附加程序,该附加程序将不仅按用户值分组输出,而且按用户 +交易编号
猜你喜欢
  • 2011-07-16
  • 2023-03-11
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2017-01-05
  • 2011-06-24
  • 1970-01-01
  • 2022-06-21
相关资源
最近更新 更多