0

序言 -

我正在运行一个在线 Java 应用程序(Tomcat->Java->Mysql)作为 SAAS(软件即服务)。这基本上是一种移动实用程序服务,用户使用他的手机连接到我们的服务/服务器,一旦用户通过身份验证,数据传输就会发生。该服务在数据中心上运行,应用服务器由负载均衡器等提供请求服务。我们的应用程序的实时更新是通过添加和删除服务器、负载均衡器转移请求来实现的,而实际上并没有完全关闭服务。

设想 -

从日志中我可以了解到,至少有一万用户一直连接到该服务。因此,为了升级而关闭服务是不切实际的。我确实使用 Java 的 API(如 HashMap、ArrayList 等)在内存缓存中使用了很多。我还没有使用像 memcache 这样的缓存框架。此外,人们使用大量手机连接到此服务,我们发现很难支持所有这些手机。

用例

当用户抱怨该服务不适合他们时,我们需要为他(以及他一个人而不是其他人)启用日志记录,以找出他到底出了什么问题。请记住,他的客户端是手机,由于这是一项在线服务,我们不能只在我们的服务器中启用日志,它将为所有用户启用,我们的日志将立即翻转,否则用户的数据将不会被在记录器生成的文本范围内很容易追踪。此外,对于客户端错误,我无法请求屏幕截图(尽管少数手机具有此功能,但大多数手机都缺少此功能,并且它们是制造麻烦的手机),我无法看到他们的移动客户端上发生了什么。因此,需要在实时服务器上完成操作,而其他用户继续不受影响。

我可以通过在运行时提供一些参数来为一个用户启用日志记录的不同方法是什么,这些参数可以随意为他们启用日志记录(当他们实际连接到服务器时)

我匆忙尝试的简单事情

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

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

3) 向经过管理员身份验证的私有 Servlet 发出请求(用户无法访问它,只允许内部 IP)并传递要记录为参数值的用户名,然后再次调用它以删除用户

还有其他/更好的方法吗?

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

4

1 回答 1

0

高级概述

  • 请求开始检测是否属于需要登录的用户
  • 将线程本地设置为 true。
  • 记录器应该检查线程本地的当前级别。
  • 处理请求...
  • 请求结束本地清除线程。
于 2011-08-01T09:03:44.580 回答