Log4j被弃用于Slf4j吗?

似乎log4j有一些类加载问题 (其中包括),在我看来,趋势是走出log4j走向slf4j。 (hibernate停止使用第一个赞成后者)

  1. 这是真的吗?
  2. log4j中slf4j解决的主要问题是什么?
  3. 是slf4j的最后一句话还是有更好的“下一个log4j”行业标准?

这是我第一个问题,所以请温柔

更新:

  • 所以这个delfuego的回答迷惑了我,你能接受/反对吗?

你似乎偶然发现了log4j(和Apache Commons Logging库)的主要问题,也就是说,他们正在使用正确的类加载器,发现并与之交互,这是一个荒谬的难题。 这里有一个非常密集的解释,并附有例子。 新的日志框架SLF4J的主要推动力之一就是完全消除这些问题。 你可能想要交换,看看你的生活是否更容易。

  • 更多的类加载log4j的问题: http : //articles.qos.ch/classloader.html

Slf4j确实只是一个伐木外观。 但是,Log4j的目的是由同一个作者的Logbackinheritance。

更新 :如果你想知道Slf4j的另一个好处,那么不需要下面的(丑)结构来避免不必要地调用toString()

 if (logger.isDebugEnabled()) { logger.debug("Message: " + bigObject + ", " + anotherBigObject); } 

您可以改为使用参数化消息:

 logger.debug("Message: {}, {}", bigObject, anotherBigObject); 

另请参阅(不)logging的最快方式是什么?

Slf4J不是Log4j的替代品,而是为日志logging提供了一个Facade,所以你可以插入你自己的日志框架。 它主要用于图书馆。 来自slf4j.org:

对于Java或(SLF4J)的简单日志门面,可以作为各种日志框架(如java.util.logging,log4j和logback)的简单外观或抽象,允许最终用户在部署时插入所需的日志框架。

回答你的问题:Slf4j现在被框架所采用,但是在你的项目中,你可以继续使用Log4J(或者其他的)

第一:重要的一点:Slf4j是前端日志logging(API),它可以在大多数主要的login系统下面使用:例如log4j或java.util.logging。 所以最好把sfl4j和commons-logging进行比较。

关于Log4j的状态,来自java日志状态 (一年前)

有一件事我没有意识到,log4j的开发基本上是死的。 它目前在1.2版本,1.3版本的计划被放弃,开发log4j 2.0。 但是,2.0并没有出现在积极的发展中。 值得注意的是,log4j项目的创始人CekiGülcü已经转向slf4j(见下文)。

看看slf4j页面,它看起来并不会取代 log4j–它只是让你为整个应用程序使用相同的底层日志框架(例如log4j),允许库自动挂钩。

它看起来更像是Apache Commons Logging的替代品而不是log4j。

在我看来,SLF4J具有巨大的优势,您可以通过它提供的桥统一logging所有使用的库。 其他日志框架都不允许这样做。 这允许项目顺利移动到SLF4J,并忽略依赖项所做的日志框架select。

Slf4j不是真正的日志logging外观。 Slf4j不支持其实现者的许多function。 简而言之,我在下面提到了log4j的例子。

  • Slf4j不能指定用户select的configuration文件,而是强制用户使用默认(log4j.properties或log4j.xml)在许多Java根(每个Jar有一个根加JVM根和类或bin)之一。 如果有两个JAR文件,那么很难控制哪一个安全使用。
  • Slf4j不能支持所有的Log4j级别,比如'致命'。 当从Log4j切换到Slf4j的大代码时,需要大量的代码改变(例如,决定如何重新排列级别)。
  • 必须select两个关键的Jar文件(log4j-over-slf4j.jar或slf4j-log4j12.jar)。 如果classpath都是,将无法正常工作。 如果随机select一个,会丢失意想不到的function(例如log4j-over-slf4j.jar不支持同一类的多个日志文件;例如一个用于事件日志,一个用于原始数据日志)。