slf4jITeye - 娱乐之横扫全球

slf4jITeye

2019年04月03日10时13分00秒 | 作者: 思菱 | 标签: 日志,运用,一个 | 浏览: 2214

http://www.importnew.com/7450.html
引证

每一个Java程序员都知道日志关于任何一个Java应用程序,尤其是服务端程序是至关重要的,而许多程序员也现已了解各种不同的日志库如java.util.logging、Apache log4j、logback。但假如你还不知道SLF4J(Simple logging facade for Java)的话,那么是时分去在你项目中学习运用SLF4J了。
在这篇文章中,咱们将学习为什么运用SLF4J比log4j或许java.util.logging要优异。自从前次我写Java程序员的10个日志技巧现已有一段时刻了,我现已不记得我写的关于日志的全部了。

不管怎样,让咱们回到这个论题,SLF4J不同于其他日志类库,与其它有很大的不同。SLF4J(Simple logging Facade for Java)不是一个真实的日志完成,而是一个笼统层( abstraction layer),它答应你在后台运用恣意一个日志类库。假如是在编写供内外部都能够运用的API或许通用类库,那么你真不会期望运用你类库的客户端有必要运用你挑选的日志类库。

假如一个项目现已运用了log4j,而你加载了一个类库,比方说 Apache Active MQ——它依靠于于别的一个日志类库logback,那么你就需求把它也加载进去。但假如Apache Active MQ运用了SLF4J,你能够持续运用你的日志类库而无语忍耐加载和保护一个新的日志结构的苦楚。

总的来说,SLF4J使你的代码独立于恣意一个特定的日志API,这是一个关于开发API的开发者很好的思维。尽管笼统日志类库的思维现已不是新鲜的事物并且Apache commons logging也现已在运用这种思维了,但现在SLF4J正敏捷成为Java国际的日志规范。让咱们再看看几个运用SLF4J而不是log4j、logback或许java.util.logging的理由。

SLF4J比照Log4J,logback和java.util.Logging的优势

正如我之前说的,在你的代码中运用SLF4J写日志句子的首要起点是使得你的程序独立于恣意特定的日志类库,依靠于特定类或许需求不同与你已有的装备,并且导致更多保护的费事。但除此之外,还要一个SLF4J API的特性使得我坚持运用SLF4J而扔掉我长期间宠爱的Lof4j的理由,是被称为占位符(place holder),在代码中表明为“{}”的特性。占位符是一个非常类似于在String的format()办法中的%s,由于它会在运转时被某个供给的实践字符串所替换。这不只降低了你代码中字符串衔接次数,并且还节省了新建的String目标。即便你或许没需求那些目标,但这个仍旧树立,取决于你的出产环境的日志等级,例如在DEBUG或许INFO等级的字符串衔接。由于String目标是不行修正的并且它们树立在一个String池中,它们耗费堆内存( heap memory)并且大多数时刻他们是不被需求的,例如当你的应用程序在出产环境以ERROR等级运转时分,一个String运用在DEBUG句子便是不被需求的。经过运用SLF4J,你能够在运转时推迟字符串的树立,这意味着只要需求的String目标才被树立。而假如你现已运用log4j,那么你现已关于在if条件中运用debug句子这种变通计划非常了解了,但SLF4J的占位符就比这个好用得多。

这是你在Log4j中运用的计划,但必定这一点都不风趣并且降低了代码可读性由于增加了不必要的繁琐重复代码(boiler-plate code):

1
2
3
if (logger.isDebugEnabled()) {
  logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}
另一方面,假如你运用SLF4J的话,你能够得到在极简练的格局的成果,就像以下展现的相同:

1
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
在SLF4J,咱们不需求字符串衔接并且不会导致暂时不需求的字符串耗费。取而代之的,咱们在一个以占位符和以参数传递实践值的模板格局下写日志信息。你或许会在想假如我有很个参数怎样办?嗯,那么你能够挑选运用变量参数版别的日志办法或许用以Object数组传递。这是一个适当的便利和高效办法的打日志办法。记住,在出产终究日志信息的字符串之前,这个办法会查看一个特定的日志等级是不是打开了,这不只降低了内存耗费并且预先降低了CPU去处理字符串衔接指令的时刻。这里是运用SLF4J日志办法的代码,来自于slf4j-log4j12-1.6.1.jar中的Log4j的适配器类Log4jLoggerAdapter。

1
2
3
4
5
6
public void debug(String format, Object arg1, Object arg2) {
  if (logger.isDebugEnabled()) {
  FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
  logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
  }
}
一同,咱们也很值得知道打日志是对应用程序的功能有着很大影响的,在出产环节上只进行必要的日志记载是咱们所主张的。

怎样用SLF4J做Log4J的日志记载

除了以上优点,我想还有一个劝诫,便是为了运用SLF4J,你不只需求包含SLF4J的API jar包,例如 slf4j-api-1.6.1.jar,还需求相关Jar包,这取决于你在后台运用的日志类库。假如你想要运用和Log4J 一同运用SLF4J ,Simple Logging Facade for Java,,你需求包含以下的Jar包在你的classpath中,取决于哪个SLF4J和你在运用的Log4J的版别。例如:

slf4j-api-1.6.1.jar – JAR for SLF4J API
log4j-1.2.16.jar – JAR for Log4J API
slf4j-log4j12-1.6.1.jar – Log4J Adapter for SLF4J
假如你在运用Maven去办理你的项目依靠,你只需求包含SLF4J JAR包,maven会包含它的依靠的相关包。为了和SLF4J一同中运用Log4J,你能够包含以下的依靠在你项目中的pom.xml。

1
2
3
4
5
6
7
8
9
10
11
dependency
  groupId org.slf4j /groupId
  artifactId slf4j-log4j12 /artifactId
  version 1.6.1 /version
/dependency

dependency
  groupId org.slf4j /groupId
  artifactId slf4j-log4j12 /artifactId
  version 1.6.1 /version
/dependency
还有,假如你关于运用变量参数版别(variable argument version )的日志办法感兴趣的话,那么就导入SLF4J 1.7的版别吧。

总结

总结这次说的,我主张运用SLF4J的而不是直接运用 Log4j, commons logging, logback 或许 java.util.logging 现已满足充分了。

在你的开源或内部类库中运用SLF4J会使得它独立于任何一个特定的日志完成,这意味着不需求办理多个日志装备或许多个日志类库,你的客户端会很感谢这点。
SLF4J供给了根据占位符的日志办法,这经过去除查看isDebugEnabled(), isInfoEnabled()等等,提高了代码可读性。
经过运用SLF4J的日志办法,你能够推迟构建日志信息(Srting)的开支,直到你真实需求,这关于内存和CPU都是高效的。
作为附注,更少的暂时的字符串意味着废物收回器(Garbage Collector)需求做更好的作业,这意味着你的应用程序有为更好的吞吐量和功能。
这些优点仅仅冰山一角,你将在开始运用SL4J和阅览其间代码的时分知道更多的优点。我强烈主张,任何一个新的Java程序员,都应该运用SLF4J做日志而不是运用包含Log4J在内的其他日志API。
更多阅览:

http://javarevisited.blogspot.com/2013/08/why-use-sl4j-over-log4j-for-logging-in.html#ixzz2konULdTB


版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    slf4jITeye

    日志,运用,一个
  • 2

    java awt Graphics 绘图ITeye

    字符串,二维码,图片
  • 3
  • 4

    spring+mybatis装备ITeye

    装备,一下,需求
  • 5

    文件的读写和操作ITeye

    文件,字节,输出
  • 6

    ubuntu下python办理ITeye

    能够,咱们,经过
  • 7

    第03章 惯例选择器 (2)ITeye

    主页,选择器,运用
  • 8

    zookeeper原理(转)ITeye

    节点,集群,一个
  • 9
  • 10