2013-01-01 34 views
0

我有一个Java服务器(基于Socket.IO for Java,但这不是问题的一部分),它接受来自Web客户端的请求,进行一些计算,并将结果发回给客户。将特定函数调用记录到特定日志

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

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

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

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

+0

这听起来并不可能,因为Log4J的将不能提前知道的文件描述符,它必须写日志。它看起来只能以编程方式完成,但是log4j API也有相应的工具。 – fge

+0

好的,那么我怎样才能以编程方式执行此操作,同时让我的应用程序保持多线程? –

回答

3

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

有一个2部分教程使用MDC herehere
理想我想也写我自己的log4j记录器用于此目的,正如这里建议:Using MDC in log4j to dynamically name the log file

+0

“在启动长操作时在MDC中设置用户名(或某个标识符),操作的所有日志都将进入特定位置(文件,取决于配置的记录器),然后在操作完成时清除MDC “ 但这意味着我不能并行运行两个实例(在两个工作线程中)? –

+1

当然你可以 - MDC是线程本地的,所以如果你有2个TX发生在2个不同的用户上,那么日志记录将会转到不同的文件。 如果您希望单个TX(针对单个用户)执行线程化,则需要将MDC带到您创建的每个新线程。如果你想在同一个用户下并行(不相关)2+ TX,你需要在MDC中放入用户+一些唯一的TX ID并编写你自己的appender,它不仅可以按用户值分组输出,还可以按用户+ tx id – radai

+0

完美地工作,谢谢! –

相关问题