怎么用Javalogin?

为什么会使用下列其中一个软件包而不是另一个?

  • Javalogging
  • Commons Logging
  • Log4j的
  • SLF4J
  • 的logback

按照api出现的时间顺序(据我所知):

  • Log4j因为大多数人都用它(以我的经验)
  • Commons Logging,因为开源项目使用它(这样它们可以与集成解决scheme中使用的任何日志框架集成); 如果您是API / Framework / OSS,并且您依赖于使用Commons Logging的其他软件包,则尤其有效。
  • Commons Logging,因为你不想“locking”到一个特定的日志框架(所以你可以lockingCommons Logging给你的东西) – 我认为决定使用这个点是不明智的。
  • Java日志logging,因为你不想添加额外的jar。
  • SLF4j,因为它比Commons Logging更新,并提供参数化日志logging:

logger.debug("The entry is {}.", entry); //which expands effectively to if (logger.isDebugEnabled()){ // Note that it's actually *more* efficient than this - see Huxi's comment below... logger.debug("The entry is " + entry + "."); } 
  • Logback,因为它比log4j更新,并且支持参数化日志logging,因为它直接实现SLF4j
  • SLF4j / Logback,因为它是由log4j的同一个人编写的,所以他做得更好了(根据Ken G–感谢,看起来比较适合他们以前的新闻post )
  • SLF4j,因为他们还发布了一个log4j适配器,所以你不必在旧代码中“切换”log4j – 只要让log4j.properties使用SLF4j,它的configuration

我发现在Java中logging混乱,不一致,logging不完善,尤其是偶然。 此外,这些日志框架之间存在着巨大的相似性,导致重复工作,以及您对实际所处的日志环境感到困惑。特别是,如果您在一个严肃的Java Web应用程序堆栈中工作,则通常一次多个日志logging环境; (例如,hibernate可能使用log4j和tomcat java.util.logging)。 Apache Commons是为了弥合不同的日志框架,但实际上只是增加了更多的复杂性。 如果你提前不知道,这是完全令人困惑的。 为什么我的日志消息不能打印到控制台等? 哦,因为我在看Tomcat日志,而不是log4j。 再增加一层复杂性,应用程序服务器可能有全局日志configuration,可能无法识别特定Web应用程序的本地configuration。 最后,所有这些日志框架都是“太复杂”了。 loginJava一直是一个混乱的混乱,让像我这样的开发人员感到沮丧和困惑。

Java的早期版本没有导致这种情况的内置日志logging框架。

有一个重要的观点没有提到:

SLF4J(Logback和LOG4J作为日志后端)支持所谓的映射诊断上下文(MDC,请参阅javadoc和文档 )。

这本质上是一个线程本地的Map <String,String>,您可以使用它来向日志logging事件添加额外的上下文信息。 MDC的当前状态附加到每个事件。

如果你把请求的用户名和URL(如果是webapp的话)放入其中,这可能是非常有用的。 例如,这可以使用filter自动完成。

另请参阅问题的答案有哪些logging错误的最佳做法? 特别是:

  • Commons Logging有一些潜在的类加载问题。

  • Log4J和SLF4J由同一个人开发,从Log4J实践中发现的问题中学习。

在我们的公司项目中,我们使用LOG4j,并且像Stephen在他的例子中所示的那样使用起来非常简单。 我们还为LOG4j编写了自己的模式类,以便您可以创build自己的输出文件模式。 你可以描述你的日志文件应该如何。 有可能增强原始的log4j类。

您可以在一个log4j.properties文件中更改所有LOG4j属性,以便您可以针对不同的项目使用不同的文件。

Java日志不是我最喜欢的,但这可能是因为我从一开始就使用log4j。

Commons Logging概述给出了其存在的原因:当你无法控制底层日志框架时,从库代码中logging日志。 对于将被链接到外部应用程序的各种Apache项目非常重要。 内部IT项目可能不是那么重要,你可以完全控制。

也就是说,我写信给Commons Logging,就像我知道的其他许多开发人员一样。 原因是尽量减less精神负担:你可以改变项目或工作,而不必学习新的框架(假如新的工作/项目也使用CL,或者你可以说服他们移动它)。

而且,在你使用的任何框架中创build你自己的包装都是有价值的。 如此处所述,我喜欢使用LogWrapper对象来提供自定义的string化(重要),并最大限度地减less日志语句的视觉混乱(不太重要)。

通常我会默认使用Log4J。

如果我不介意依赖Java 1.4,我会使用Java Logging,但是我仍然会优先使用Log4J。

如果我正在增强已经使用它的东西,我会使用Commons Logging。

我会build议创build一个可以写入任何日志框架的精简日志logging外观,在这一点上,备份引擎的select变得非常有意义。