如何在运行时为Java Service中的单个用户启用日志记录

时间:2011-08-01 08:27:08

标签: java logging saas audit-trail

序言 -

我正在运行在线Java应用程序(Tomcat-> Java-> Mysql)作为SAAS(软件即服务)。这基本上是一种移动实用程序服务,其中用户使用他的移动电话连接到我们的服务/服务器,并且一旦用户被认证就进行数据传输。该服务在数据中心上运行,其中应用服务器由负载均衡器提供请求,依此类推。我们的应用程序的实时更新通过添加和删除服务器,通过负载均衡器转移请求而不实际完全关闭服务来实现。

情景 -

从日志中我可以理解,至少有一万名用户一直连接到该服务。因此,降低服务以进行升级是不切实际的。我使用Java的API(如HashMap,ArrayList等)使用大量内存缓存。我还没有使用像memcache这样的缓存框架。此外,人们使用大量的移动电话连接到这项服务,我们发现很难支持所有这些服务。

用例

当用户抱怨服务不适合他们时,我们需要为他启用日志记录(并且他自己而不是其他人)以找到他的结果出了什么问题。请记住,他的客户端是手机,因为这是一个在线服务,我们不能只在我们的服务器中启用日志,它将为所有用户启用,我们的日志将立即翻转或用户的数据不会可以在记录器生成的文本中轻松追踪。此外,我无法请求屏幕截图(虽然有一些手机具有此功能,但大部分都缺少它,而且它们是制造麻烦的那些),因为客户端错误,我无法看到他们的移动客户端上发生了什么。因此,事情需要在实时服务器上完成,而其他用户继续不受影响。

我可以通过在运行时提供一些参数来为一个用户启用日志记录的不同方法有哪些方法可以随意记录它们(当它们实际连接到服务器时) < / p>

我急忙尝试的简单事情

1)保留一个最初为空的列表,当某个用户说该服务不适合他时,在表中添加他的用户名。以特定间隔扫描表的线程将获取用户名并开始打印用户特定日志。打印日志后删除条目。但我需要等到线程到来并执行操作。 同样作为策略,我们不应该生成/运行除请求 - 响应线程之外的其他线程。

2)保留一个空文件并在其中添加条目,并按照与第1点中提到的db表相同的方式进行操作

3)向管理员身份验证的私有Servlet发出请求(用户无法访问此请求,仅允许内部IP)并传递要作为param-value记录的用户名,然后再次调用它以删除用户< / p>

任何其他/更好的方式?

PS。使用java.util.logging.Logger作为记录器

1 个答案:

答案 0 :(得分:0)

高级概述

  • 请求检测的开始是否属于需要记录的用户
  • 将thread local设置为true。
  • logger应检查本地线程的当前级别。
  • 处理请求......
  • 请求结束明确线程本地。