设计网站公司 都赞湖南岚鸿案例10,郑州做的比较好网站公司吗,小程序源码之家,杭州做商务网站原文链接 译者#xff1a;zivyuJava的简单日志门面( Simple Logging Facade for Java SLF4J)作为一个简单的门面或抽象#xff0c;用来服务于各种各样的日志框架#xff0c;比如java.util.logging、logback和log4j。SLF4J允许最终用户在部署时集成自己想要的日志框架。需要…原文链接 译者zivyuJava的简单日志门面( Simple Logging Facade for Java SLF4J)作为一个简单的门面或抽象用来服务于各种各样的日志框架比如java.util.logging、logback和log4j。SLF4J允许最终用户在部署时集成自己想要的日志框架。需要注意的是你的应用启用SLF4J意味着需要一个额外的依赖slf4j-api-1.7.19.jar。从1.6.0开始如果在class path没有找到绑定SLF4J将默认一个无操作的实现。从1.7.0开始Logger接口中的打印方法现在提供variants取代了Object[]用来接收可变长参数。这个改变意味着SLF4J需要JDK 1.5或更高的版本。Java编译器在底层把方法中的可变参数部分转换成Object[]。因此编译器生成的Logger接口在1.7.x版本中和它对应的的1.6.x版本中是没有区别的。因此SLF4J得1.7.x版本和1.6.x版本是 完全兼容的。从1.7.5开始日志的检索时间有了一个显著的改善鉴于这个改善非常鼓励用户迁移到SLF4J 1.7.5或更高的版本。从1.7.9开始 通过设置 slf4j.detectLoggerNameMismatch 系统属性为trueSLF4J能自动的 spot incorrectly named loggers.Hello World按照惯例下面的示例说明最简单的方法使用SLF4J输出”hello world“。他首先获取一个名为”HelloWorld“的记录器这个记录器用来记录”HelloWorld“。import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HelloWorld {public static void main(String[] args) {Logger logger LoggerFactory.getLogger(HelloWorld.class);logger.info(Hello World);}}运行这个示例首先你需要下载slf4j发行版 download the slf4j distribution然后解压。做完这些之后把 slf4j-api-1.7.19.jar添加到你的class path。编译运行HelloWorld控制台将有一下输出SLF4J: Failed to load class org.slf4j.impl.StaticLoggerBinder.SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.这个警告会被打印是因为在class path下没有找到绑定的slf4j。一旦你添加一个绑定在你的class path下这个警告将会消失。假设你添加了 slf4j-simple-1.7.19.jar你的class path包含slf4j-api-1.7.19.jarslf4j-simple-1.7.19.jar编译并运行HelloWorld程序现在在控制台会有下列输出0 [main] INFO HelloWorld - Hello World典型使用模式下面的示例代码表明了SLF4J的典型使用模式。注意15行”{}“的使用查看 “What is the fastest way of logging?”获取更多细节。1: import org.slf4j.Logger;2: import org.slf4j.LoggerFactory;3:4: public class Wombat {5:6: final Logger logger LoggerFactory.getLogger(Wombat.class);7: Integer t;8: Integer oldT;9:10: public void setTemperature(Integer temperature) {11:12: oldT t;13: t temperature;14:15: logger.debug(Temperature set to {}. Old temperature was {}., t, oldT);16:17: if(temperature.intValue() 50) {18: logger.info(Temperature has risen above 50 degrees.);19: }20: }21: }在部署时绑定一个日志框架像在之前提到过的SLF4J支持各种各样的日志框架。SLF4J的发行版附带的几个jar被称为” SLF4J bindings“ 每个绑定都对应一个支持的框架。slf4j-log4j12-1.7.19.jar绑定 log4j version 1.2一个广泛使用的日志框架你也需要在class path放置 log4j.jar。slf4j-jdk14-1.7.19.jar绑定 java.util.logging也被称为JDK 1.4 日志。slf4j-nop-1.7.19.jar绑定 NOP默默地打出所有的日志。slf4j-simple-1.7.19.jar绑定 Simple实现输出所有的System.err事件只有INFO和更高级别的信息会被打印。这个绑定或许 在小应用程序的上下文中非常有用。logback-classic-1.0.13.jar (requires logback-core-1.0.13.jar)本地实现也有SLF4J的绑定在SLF4J项目之外比如 logback 在本地实现了SLF4J。Logback的 ch.qos.logback.classic.Logger 类直接实现了SLF4J的 org.slf4j.Logger接口。因此和logback一起使用SLF4J涉及到严格零内存和计算开销。切换日志框架只需要替换class path中的slf4j绑定。比如说从 java.util.logging切换到 log4j仅仅把 slf4j-jdk14-1.7.19.jar替换成 slf4j-log4j12-1.7.19.jar。SLF4J不依赖于特定的类加载机制。事实上每个SLF4J绑定在编译时硬连接来使用一个指定的日志框架。比如说 slf4j-log4j12-1.7.19.jar在编译时绑定使用log4j。在你的代码中除 slf4j-api-1.7.19.jar之外只能有一个你选择的绑定 到正确的class path 路径上。不要在class path 放置多个绑定。下面是一个图表来说明一般的想法。SLF4J接口和他们的各种各样的适配器非常简单。大多数熟悉Java语言的开发者应该能在一小时之内读懂代码。不需要类加载的知识。因此SLF4J没有遭受类加载问题或者 Jakarta Commons Logging (JCL)观察到的内存泄露问题。鉴于SLF4J接口的简单性和它的部署模型新的日志框架开发者应该觉得很容易编写SLF4J绑定。库为了避免给他们的终端用户强加一个日志框架 一些组件和库的作者可能会针对SLF4J接口进行编程。因此终端用户在部署时可以通过在classpath插入对应的slf4j绑定来选择他们期望的日志框架。并且可以把在classpath存在的绑定替 换到另外一个然后重启应用从而达到切换日志框架的目的这个方法被证明是非常简单和健壮的。SLF4J的1.6.0版本如果在class path 没有发现绑定slf4j-api将默认一个无操作的实现来忽略所有的日志请求。因此SLF4J从1.6.0版开始发出一个缺少绑定的警告然后丢弃所有的打印日志请求而不是抛出 NoClassDefFoundError异 常因为缺少 org.slf4j.impl.StaticLoggerBinder 类 。比如说 Wombat 一些基础框架依赖于SLF4J来打印日志。为了避免强加一个日志框架给终端用户Wombat 包含 slf4j-api.jar但是没有绑定。在class path 没有SLF4J绑定的情 况下Wombat的发行版依然能开箱即用不需要终端用户下载从SLF4J网站下载一个绑定。仅仅当终端用户开启日志的时候将需要安装他选择的日志框架对应的SLF4J绑定。基本准则内置的组件比如库和框架不应该声明任何SLF4J的依赖但是依赖于SLF4J-api。当一个库在一个指定的绑定声明一个传递依赖这个强加于终端用户的绑定否定了SLF4J的目的。注意在绑定上声明一个非传递性的依赖比如说 对测试不影响终端用户。声明项目的日志依赖鉴于Maven的传递依赖规则对于”regular“项目(不是库和框架)日志依赖声明 可以通过一个单独的依赖声明来实现。LOGBACK-CLASSIC 如果你希望使用 logback-classic 作为底层的日志框架你需要做的所有事情就是声明” ch.qos.logback:logback-classic“依赖到你的pom.xml文件中。除了 logback-classic-1.0.13.jar之外它将拉取 slf4j-api-1.7.19.jar和 logback-core-1.0.13.jar 到你的项目中。注意显式的声明 logback-core-1.0.13或 slf4j-api-1.7.19.jar没有错并且可能需要强加一个正确的版本。ch.qos.logbacklogback-classic1.0.13LOG4J如果你希望使用log4j作为底层的日志框架你需要做的所有事情就是声明” org.slf4j:slf4j-log4j12“依赖到你的pom.xml文件中。除了 slf4j-log4j12-1.7.19.jar之外它将拉取 slf4j-api-1.7.19.jar和 log4j-1.2.17.jar到你的项目 中。注意显示地声明一个依赖 log4j-1.2.17.jar或 slf4j-api-1.7.19.jar 没有错。并且可能需要强加一个正确的版本org.slf4jslf4j-log4j121.7.19JAVA.UTIL.LOGGING如果你希望使用 java.util.logging 作为底层的日志框架你需要做的所有事情就是声明” org.slf4j:slf4j-jdk14“依赖到你的pom.xml文件中。除了 slf4j-jdk14-1.7.19.jar之外它将拉取 slf4j-api-1.7.19.jar到你 的项目中。注意显示地声明一个依赖 slf4j-api-1.7.19.jar 没有错。并且可能需要强加一个正确的版本。org.slf4jslf4j-jdk141.7.19二进制兼容一个SLF4J绑定指定一个具体的依赖用来在底层日志框架绑定slf4j比如说 slf4j-jdk14.jar或 slf4j-log4j12.jar。不同版本的 slf4j-api.jar和SLF4J绑定混合在一起可能会引起问题。比如说如果你使用 slf4j-api-1.7.19.jar然后你应该使用 slf4j-simple-1.7.19.jar使用 slf4j-simple-1.5.5.jar将不会正常工作。然而从客户端的观点来看所有版本的 slf4j-api都是兼容的。使用 slf4j-api-N.jar编译的客户端代将和 slf4j-api-M.jar一起完美运行N和M都是任意的。你仅仅需要确保你绑定的版本和 slf4j-api.jar 匹配。你不需要担心项目中给定的依 赖的slf4j-api.jar的版本。你可以使用任何版本的 slf4j-api.jar只要 slf4j-api.jar的版本和它的绑定匹配就不会有问题。在初始化的时间如果SLF4J怀疑可能有不匹配问题。将会发出关于不匹配的警告信息。通过SLF4J统一日志通常一个给定的项目依赖于各种各样的组件这些组件依赖的日志API不是SLF4J。一个项目依赖于一个JCL、java.util.logging、log4j和SLF4J是很常见的。然后通过一个单独的方式来统一日志变得让人满意。SLF4J通过提供对JCL、java.util.logging、和slf4j的桥接模块来满足这个普通的用例。更详细的内容请参考 Bridging legacy APIs.MDC支持“Mapped Diagnostic Context”本质上是日志框架包含的一个map应用程序代码提供了key-value对这个键值对能被日志框架插入到日志信息中去。MDC数据在过滤信息或触发某些操作时是非常有用的。SLF4J支持MDC如果一个底层的日志框架提供了MDC功能SLF4J将委托给底层日志框架的MDC。注意现在仅仅只有log4j和logback提供了MDC功能。如果底层日志框架不支持MDC比如说java.util.logginSLF4J将存储MDC数 据但是里面的数据需要用户通过代码来获取。因此作为一个SLF4J使用者能利用当 log4j和logback存在时的 MDC信息但是不能强迫用户依赖这些日志框架。行动纲要AdvantageDescription在部署时候选择日志框架通过在class path插入合适的jar期望的日志框架能在部署时集成。快速失败操作由于虚拟机加载类的方式很早就自动验证框架绑定。如果SLF4J没有在class path 发现一个绑定它将会发出一个警告信息并且默认一个无操作的实现。绑定流行的日志框架SLF4J支持流行的日志框架log4J、java.util.logging、Simple logging和NOP。 logback天生支持SLF4J。桥接遗留的logging APIs通过SLF4J实现JCL如 jcl-over-slf4j.jar将允许项目迁移到SLF4J没有破坏使用JCL的软件的兼容性。同样的 log4j-over-slf4j.jar 和 jul-to-slf4j模块重定向log4j到SLF4J。查看 Bridging legacy APIs 获取更多信息移动你的源码slf4j-migrator工具能帮助你迁移你的代码来使用SLF4J。支持参数化的日志信息所有的SLF4J绑定支持参数化的日志信息。并且可以显著提高性能。 improved performance