代码之家  ›  专栏  ›  技术社区  ›  Chadwick

如何从Java堆栈中统一日志格式

  •  6
  • Chadwick  · 技术社区  · 15 年前

    使用一个从Maven开始的JettyWeb服务器,它包括iBatis、Spring、Jersey,其中一点和另一点,我得到了大量格式的日志输出。

    一些来自Maven:

    [INFO] [war:war]
    [INFO] Exploding webapp...
    

    有些来自码头:

    2009-03-25 21:01:27.781::INFO:  jetty-6.1.15
    2009-03-25 21:01:28.218:/example:INFO:  Initializing Spring root WebApplicationContext
    

    有些来自春天:

    INFO  ContextLoader - Root WebApplicationContext: initialization started (189)
    INFO  XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml] (323)
    

    一些来自泽西岛:

    Mar 25, 2009 9:01:29 PM com.sun.jersey.spi.spring.container.SpringComponentProviderFactory register
    

    还有一些来自我的代码:

    INFO  ExampleApp - [User@14ef239 ...stuff] (69)
    

    我希望他们都使用标准日志包(Log4J,CAMONS日志,Java日志……)

  • 有可能吗?配置所有文件使用相同格式的最简单方法是什么?
  • 将它们保留为不同的格式有什么好处吗?
  • 8 回复  |  直到 14 年前
        1
  •  5
  •   Miquel    15 年前

    这可以使用logback库及其网桥。它基本上包括从类路径中删除任何log4j commons或类似jar,为log4j或类似对象粘贴logback jar文件和桥接jar。Spring、Jersey和Maven将使用Bridge工厂来实例化记录器,反过来使用Logbak生成统一的日志。

    检查 http://logback.qos.ch/ http://www.slf4j.org/legacy.html

    关键是将其他日志实用程序与单个全局记录器链接起来的网桥。

        2
  •  1
  •   deverton    15 年前

    您遇到的问题是,应用程序正在使用不同的日志记录库。泽西岛将使用jul,spring将使用commons日志(如果在类路径中,则反过来选择log4j),而jetty使用自己的日志。您可以通过让所有组件登录到7月来解决这个问题。

    首先,你需要把log4j从你的类路径中去掉。使用排除或其他机制确保不包括log4j。这将阻止Commons日志在7月选择log4j,并使Spring以与Jersey相同的格式进行日志记录。

    接下来,您需要配置jetty以使用通用日志记录。您可以在 Maven Jetty Plugin documentation 页。

    如果应用程序代码直接使用log4j,则需要切换到commons日志或jul。

    Maven我不太确定,但可能有类似的解决方案。

        3
  •  0
  •   John Feminella    15 年前

    我不知道有什么办法可以有效地管理你所描述的内容。如果你不顾一切的话,我能提出的最好建议是写一些东西,在一个保护伞下统一不同的格式,并使用你喜欢的日志格式在那里进行管理。

        4
  •  0
  •   Jonathan Holloway    15 年前

    我不认为您可以轻松地统一所有这些内容,因为您不知道每个框架使用的是什么。

    如果您确定了您感兴趣的文件,那么您可以让每个文件输出到中心位置/var/log/app中的日志文件(例如在Linux下)。从这里,您可以编写一个简单的实用程序来解析每个日志文件,并以您想要的格式将数据按摩到单个日志文件中。awk实用程序非常擅长做这种事情。

    或者,您可以让它们保持原样,并使用类似splunk的工具对文件进行索引,以便将来进行搜索和分析。这实际上取决于您以后从日志文件中需要什么。希望有帮助。

        5
  •  0
  •   StaxMan    15 年前

    如果他们使用标准的日志记录包,那么当然,您可以统一公共部分(“信息”前缀、时间戳、类别名称(通常是类/包))。只需配置log4j/j.u.l/logback就可以了。 我不知道为什么会有不同的格式——日志格式不是由框架配置的,而是由应用程序配置的——所以也许它们使用的是不同的框架。但这可能是偶然的。

    至于它是否重要,那么,只有当您自动处理它时(触发基于regex的警报)。

        6
  •  0
  •   Ceki    15 年前

    SLF4J允许您通过将日志路由到单个日志框架来整合日志。您可以重定向使用commons logging、java.util.logging和log4j进行的传统日志记录调用,就像它们被发送到slf4j一样。有关详细信息,请参阅www.slf4j.org/legacy.html。

    然后,所有日志将委托给您选择的底层框架,例如logback、log4j、java.util.logging等。如果遇到问题,请联系SLF4J用户邮件列表。

        7
  •  0
  •   GreenieMeanie    15 年前

    我认为我们最终需要一个“日志API”日志API,它将所有统一的日志API(如SLF4J)以及其他任何API捆绑在一起。谁知道呢,你可能需要改变你的日志框架来处理所有类型的日志。

        8
  •  0
  •   Elango    14 年前

    简单使用 http://logback.qos.ch/translator/ 将log4j.properties转换为XML格式并将其粘贴到logback.xml中。这可以将日志引导到配置的附加器。