【发布时间】:2011-08-01 08:27:08
【问题描述】:
序言 -
我正在运行一个在线 Java 应用程序(Tomcat->Java->Mysql)作为 SAAS(软件即服务)。这基本上是一种移动实用程序服务,用户使用他的手机连接到我们的服务/服务器,一旦用户通过身份验证,数据传输就会发生。该服务在数据中心上运行,应用服务器由负载均衡器等提供请求服务。我们的应用程序的实时更新是通过添加和删除服务器、负载均衡器转移请求来实现的,而实际上并没有完全关闭服务。
场景 -
从日志中,我可以了解到至少有一万用户一直连接到该服务。因此,为了升级而关闭服务是不切实际的。我使用 Java 的 API(如 HashMap、ArrayList 等)确实使用了很多内存缓存。我还没有使用像 memcache 这样的缓存框架。此外,人们使用大量手机连接到此服务,我们发现很难支持所有这些手机。
用例
当用户抱怨该服务不适合他们时,我们需要为他(以及他一个人,而不是其他人)启用日志记录,以找出他的问题所在。请记住,他的客户端是手机,因为这是一项在线服务,我们不能只在我们的服务器中启用日志,它将为所有用户启用,我们的日志将立即翻转,否则用户的数据将不会被在记录器生成的文本范围内很容易追踪。此外,对于客户端错误,我无法请求屏幕截图(尽管少数手机具有此功能,但大多数手机都缺少此功能,并且它们是制造麻烦的手机),我无法看到他们的移动客户端上发生了什么。因此,需要在实时服务器上完成操作,而其他用户继续不受影响。
通过在运行时提供一些参数(当他们实际连接到服务器时)为他们启用日志记录,我可以只为一个用户启用日志记录有哪些不同的方法
我匆忙尝试的简单事情
1) 保留一个单列表,该表最初是空的,当一些用户说该服务不适合他时,将他的用户名添加到表中。以特定间隔扫描表的线程将获取用户名并开始打印用户特定的日志。打印日志后删除条目。但我需要等到线程来并执行操作。 同样作为一项政策,我们不应该产生/运行除请求响应线程之外的其他线程。
2) 保留一个空文件并在其中添加条目,并遵循与第 1 点中提到的 db 表中相同的方式
3) 向经过管理员身份验证的私有 Servlet 发出请求(用户无法访问,只允许内部 IP)并传递要记录为参数值的用户名,然后再次调用它以删除用户
还有其他/更好的方法吗?
附言。使用 java.util.logging.Logger 作为记录器
【问题讨论】:
标签: java logging saas audit-trail