Java Web应用程序的高级日志记录

时间:2016-02-16 09:37:32

标签: java google-app-engine logging jetty google-cloud-logging

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

  1. 将日志流式传输到数据库(例如,sql,bigquery或其他)
  2. 自动记录重要数据(如应用程序上下文,请求网址,请求ID,浏览器用户代理,用户ID等)
  3. 对于第1点,我可以使用"缓冲"实现,将日志放入不同的列表,并定期将cron(线程)收集到内存中的所有日志并将它们写入数据库(也可以在另一台服务器上)

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

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

    App Engine会自动记录这类信息(更多,如延迟,cpu使用等,但这更复杂),它可以在项目的控制台日志中找到(也可以复制日志)到大型查询表)我需要一些Jetty或其他Java Web应用服务器。

    那么,还有另一种方法吗,其他模式,不同的方法? (无法找到任何这些点的第三方库)

    谢谢。

1 个答案:

答案 0 :(得分:2)

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

您可以遵循以下惯例:

  • 只需使用标准记录器记录到文件
  • 如果您需要查看请求上下文中的日志)Logback,Log4J和SLF4J支持Mapped Diagnostic Context (MDC),这可以用来将当前请求放入每个日志行(只是初始化过滤器中的上下文,例如放置请求ID,或生成随机uuid)。您可以稍后通过此ID汇总日志条目
  • 然后使用ELK:
    • Logstash收集了日志
    • 用于存储日志的ElasticSearch
    • 使用Kibana
    • 进行分析