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

Java Web应用程序的高级日志记录,java,google-app-engine,logging,jetty,google-cloud-logging,Java,Google App Engine,Logging,Jetty,Google Cloud Logging,我想为我的java web应用程序构建一个更高级的日志机制,类似于应用程序引擎日志。 我的需要是: 将日志流式传输到数据库(例如sql、bigquery或其他) 自动记录重要数据(如应用程序上下文、请求url、请求id、浏览器用户代理、用户id等) 对于第1点,我可以使用“缓冲”实现,将日志放入不同的列表中,并定期由一个cron(线程)收集内存中的所有日志,并将其写入数据库(也可以在另一台服务器上) 对于第2点,我发现这样做的唯一方法是将所需的对象注入到我的类(子系统)中,如ServletCon

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

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

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

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

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

    那么,有没有其他的方法,其他的模式,不同的方法?(找不到这些点的第三方库)


    谢谢。

    你真的不需要发明自行车

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

    • 只需使用标准记录器将日志记录到一个文件
    • (如果您需要在请求上下文中查看日志)Logback、Log4J和SLF4J支持,这就是您可以用来将当前请求放入每个日志行的功能(只需在筛选器中初始化上下文,例如放入请求id,或生成随机uuid)。以后可以按此id聚合日志条目
    • 然后使用麋鹿:
      • 收集日志到
      • ElasticSearch用于存储日志
      • 分析使用

    好吧,给你一个你似乎遗漏的谜题:应用程序引擎记录请求。您可以通过添加过滤器来实现这一点。您可以让筛选器提供一个仅用于当前请求的记录器实例,然后在请求完成时处理写操作。这是坏习惯吗?是的,因为每个请求都会增加很多开销。我建议您在尝试您自己的日志程序之前,先查看ususal logger框架(log4j等),看看有什么可能。关于使用过滤器,我不确定我是否完全理解,但这是否意味着我仍然必须创建一个日志对象并将其传递给所有子系统?因此,在自定义MyClass中,我仍然无法调用Log.getLog().print(myMessage)之类的东西,对吗?我需要一个Logger对象,创建时使用静态方法,但具有每个请求范围。。。否则,在不向使用的类传递requst(上下文)数据的情况下,我将采用何种方式将日志消息匹配(绑定)到请求ID?这在跟踪在单个请求中完成的许多步骤和复杂操作时非常有用,而且我找不到通过日志库实现类似smth的方法。也许我遗漏了什么…因为每个请求都应该在一个单独的线程上处理,所以在同一个请求期间写入的所有日志都将具有相同的线程id。