如何统一java堆栈中的日志记录格式

时间:2009-03-26 01:43:26

标签: java logging formatting

使用Jetty Web服务器,从maven开始,包括iBatis,Spring,Jersey,以及其中的一小部分,我得到了一系列格式的日志输出。

有些人来自maven:

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

有些人来自Jetty:

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

有些来自Spring:

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,commons-logging,java-logging ......)

  • 是否可能,以及将所有这些配置为使用相同格式的最简单方法是什么?
  • 以不同格式留下它们有什么好处吗?

  • 8 个答案:

    答案 0 :(得分:5)

    使用logback库及其桥接器可以实现这一点。它基本上包括从类路径中删除任何log4j公共或类似的jar,坚持logback jar文件和为log4j和类似的桥接jar。 Spring,jersey和maven将使用桥接工厂来实例化logger,而logger将使用logbak生成统一日志记录。

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

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

    答案 1 :(得分:1)

    您遇到的问题是应用程序正在使用不同的日志记录库。 Jersey将使用JUL,Spring将使用commons-logging(如果在你的类路径中,它将依次选择log4j),Jetty使用自己的记录器。您可以通过让所有组件登录JUL来解决此问题。

    首先,您需要从类路径中获取log4j。使用排除或其他机制来确保不包含log4j。这将阻止公共日志记录通过JUL选择log4j并使Spring以与Jersey相同的格式登录。

    接下来,您需要配置Jetty以使用commons-logging。您可以在Maven Jetty Plugin documentation页面上找到相关信息。

    如果您的应用程序代码直接使用log4j,则需要切换到commons-logging或JUL。

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

    答案 2 :(得分:0)

    我不知道以任何方式管理你所描述的内容。如果你很绝望,我可以做的最好的建议是写一些东西来统一不同的格式在一个伞下,并使用你喜欢的日志格式管理它。

    答案 3 :(得分:0)

    我认为您不能轻易统一所有这些,因为您不知道每个框架使用的是什么。

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

    或者,您可以保留原样 - 并使用Splunk之类的东西来索引文件以供将来搜索和分析。这实际上取决于日后对日志文件的要求。希望有所帮助。

    答案 4 :(得分:0)

    如果他们使用标准日志包,当然你可以统一公共部分(“INFO”前缀,时间戳,类别名称(通常是类/包))。只需根据自己的喜好配置log4j / J.U.L / logback。 我不知道为什么你会得到不同的格式 - 日志格式不是由框架配置,而是由应用程序配置 - 所以他们可能使用不同的框架。但这可能是偶然的。

    是否重要;好吧,只有你自动处理它(触发基于正则表达式的报警)。

    答案 5 :(得分:0)

    SLF4J允许您通过将日志记录路由到单个日志记录框架来整合日志记录。您可以将使用commons-logging,java.util.logging和log4j进行的旧式日志记录调用重定向,就好像它们是对SLF4J进行的一样。有关详细信息,请访问www.slf4j.org/legacy.html。

    然后将所有日志记录委派给您选择的底层框架,例如logback,log4j,java.util.logging等。如果遇到麻烦,请联系slf4j-user邮件列表。

    答案 6 :(得分:0)

    我认为我们最终需要一个“logging api”logging api,它将所有统一的日志记录api连接在一起,例如slf4j和其他任何一个。谁知道,您可能需要更改一天处理所有类型的日志记录的日志框架......

    答案 7 :(得分:0)

    只需使用http://logback.qos.ch/translator/将log4j.properties转换为xml格式并将其粘贴到logback.xml中。这可以作为魅力指导您的日志配置为appender。