1

我想为我的 java web 应用程序构建一个更高级的日志记录机制,类似于 App 引擎日志。我的需求是:

  1. 将日志流式传输到数据库(例如 sql、bigquery 或其他)
  2. 自动记录重要数据(如应用上下文、请求 url、请求 id、浏览器用户代理、用户 id 等)

对于第 1 点,我可以使用“缓冲”实现,将日志放入不同的列表中,并定期由 cron(线程)收集内存中的所有日志并将它们写入数据库(也可以在另一台服务器上)

对于第 2 点,我发现这样做的唯一方法是将所需的对象注入到我的类(子系统)中,如 ServletContext、HttpServletReqest、当前用户等,所有这些都建模为自定义类(比如说 AppLogContext),然后可以由日志记录机制使用。

这里的问题是我不知道这是否是一个好习惯。例如,这意味着许多类必须包含这个可以访问 servlet 上下文和 http 请求对象的对象,我认为这可能会产生架构问题(在构建模块、层等时)甚至安全问题。

App Engine 将自动记录此类信息(以及更多,如延迟、cpu 使用情况等,但这更复杂),并且可以在项目的控制台日志中找到(也可以将日志复制到大查询表),我需要 Jetty 或其他 java web 应用服务器的东西。

那么,是否有另一种方式来做到这一点,其他模式,不同的方法?(找不到任何这些点的第 3 方库)

谢谢你。

4

1 回答 1

2

你真的不需要发明自行车。

您可以遵循一种常见的做法:

  • 只需使用标准记录器记录到文件中
  • 如果您需要在请求上下文中查看日志)Logback、Log4J 和 SLF4J 支持映射诊断上下文 (MDC),这就是您可以用来将当前请求放入每个日志行的内容(只需在过滤器中初始化上下文,例如放入请求 id ,或生成随机 uuid)。您可以稍后按此 ID 聚合日志条目
  • 然后使用 ELK:
于 2016-02-16T10:39:45.353 回答