java slf4j_SLF4J 使用手册

原文链接  译者:zivyu

Java的简单日志门面( 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 系统属性为true,SLF4J能自动的  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 implementation

SLF4J: 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.jar

slf4j-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 放置多个绑定。下面是一个图表来说明一般的想法。

168dac4022032d26bc34ab7a5348baa7.png

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.logback

logback-classic

1.0.13

LOG4J:如果你希望使用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.slf4j

slf4j-log4j12

1.7.19

JAVA.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.slf4j

slf4j-jdk14

1.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.loggin,SLF4J将存储MDC数 据,但是里面的数据需要用户通过代码来获取。

因此,作为一个SLF4J使用者,能利用当 log4j和logback存在时的 MDC信息,但是不能强迫用户依赖这些日志框架。

行动纲要

Advantage

Description

在部署时候选择日志框架

通过在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

d0c1501a6d8bb921cf36400dc89de69f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[译]Java 垃圾回收介绍

说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Introduction 在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的。和C语言不一样的是,开发中不需要在Java中写垃圾回收代码。这也是使Java更加流行而且帮…

打印三角形

直角三角形 #include<iostream> using namespace std; int main() { int i,j; for(i1;i<10;i) {for(j1;j<i;j) cout<<"*"; cout<<endl; } } ———————————————————————————…

Linux基础入门学习笔记之二

第三节 用户及文件权限管理 Linux用户管理 Linux是可以实现多用户登录的操作系统 查看用户who命令用于查看用户 shiyanlou是当前登录用户的用户名 pts/0中pts表示伪终端&#xff0c;后面的数字表示伪终端的序号。 后面是当前伪终端启动时间 创建用户创建用户需要root权限&#…

这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下...

这个TBlog已经全新改版了&#xff0c;更名为UUBlog 新版地址&#xff1a; 用Python和Django实现多用户博客系统——UUBlog 断断续续2周时间吧&#xff0c;用django做了一个多用户博客系统&#xff0c;现在还没有做完&#xff0c;做分享下,以后等完善了再慢慢说 做的时候房展了博…

MySQL数据高级查询之连接查询、联合查询、子查询

2019独角兽企业重金招聘Python工程师标准>>> 一、连接查询 连接查询: 将多张表(>2)进行记录的连接(按照某个指定的条件进行数据拼接)。 连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表. 连接查询: join, 使用方式: 左表 join 右表&#xff1b;左…

Oracle11g解锁报错SP2-0306-选项无效

普通用户登录isqlplus: (一)在浏览器中输入URL &#xff08;http://localhost:5560/isqlplus&#xff09;。显示登录界面 这里只能用普通用户进行登录&#xff0c;因为要用sys登录&#xff0c;必须用sys的DBA身份登录。所以用普通用户SCOTT&#xff0c;但是还未解锁 问题:SP2-0…

Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?

很多新用户在安装了Chrome浏览器或者更新过的的时候&#xff0c;经常提示“ adobe flash player 已过期”的问题&#xff0c;反复提示&#xff0c;导致无法观看视频。于是从网上也找了很多办法都没有解决。这里给大家提供一个最完美的解决方案。经亲自测试&#xff0c;完美解决…

关于JVM的垃圾回收GC的一些记录

目录 一、JVM内存区域划分 二、从一个基本问题开始引入垃圾回收 三、GC作用的区域 三、如何确定一个对象是否可以被当成垃圾进行回收 &#xff08;1&#xff09;引用计数法 &#xff08;2&#xff09;可达性分析算法 &#xff08;3&#xff09;引用的类型 &#xff08;3…

codevs1219 骑士遍历(棋盘DP)

题目描述 Description设有一个n*m的棋盘&#xff08;2≤n≤50&#xff0c;2≤m≤50&#xff09;&#xff0c;如下图&#xff0c;在棋盘上有一个中国象棋马。 规定&#xff1a; 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2&#xff0c;求出马从x1,y1出发到x2,y2的…

java ssh免密登录_SSH公钥、私钥配置(SSH免密码登录方式)

1.首先使用想要发起ssh免密访问的用户A登录Linux(简称客户端Linux)2.进入该用户的家目录(cd ~)&#xff0c;看是否有.ssh文件夹(linux中以.开头文件夹是隐藏的&#xff0c;使用ll -a进行查看)&#xff0c;如果没有则创建(mkdir ~/.ssh)&#xff0c;并修改访问权限(chmod 700 ~…

win8, VS2013 .NET 4.5在哪找svcutil.exe?

我这个纠结呀&#xff0c;公司用win8&#xff0c; .NET 4.5。想做一个很简单的项目&#xff0c;就是wcf宿主iis&#xff0c;项目根目录下有aspx文件和svc文件。于是参考了一个博客http://www.cnblogs.com/yjmyzz/archive/2008/08/19/1270961.html&#xff0c;[原创]WCF入门级使…

Starling 2D框架简介

本系列是对Introducing Starling pdf的翻译&#xff0c;下文是对adobe开发人员中心的一片日志的转载&#xff0c;地址为http://www.adobe.com/cn/devnet/flashplayer/articles/introducing_Starling.html Starling 是在 Stage3D APIs 基础上开发的一种 ActionScript 3 2D 框架&…

Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度

Android AutoCompleteTextView 控件实现类似被搜索提示&#xff0c;效果如下 1.首先贴出布局代码 activity_main.xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res…

java即时聊天系统毕业_(完整版)基于Java即时聊天系统的设计与实现毕业论文设计...

目录1 前言...................................................................................................................................1.1 课题选题背景...................................................................................................…

java与算法_Java与算法之(1) - 冒泡排序

冒泡排序法的原理是&#xff0c;每次比较相邻的两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序&#xff0c;从最左侧开始&#xff0c;首先比较4和3因为是从小到大排序&#xff0c;4和3的顺序显然是错误的&#xff0…

JQuery链式操作简单的菜单列表

看到这个简单的菜单demo&#xff0c;也是为了再看看JQuery对DOM的操作&#xff0c;一直都记不牢&#xff0c;特别是siblings&#xff08;&#xff09;这个总是想不起来。 这次再过一遍JQuery&#xff0c;不管简单的还是复杂的demo 还是坚持练习一遍吧&#xff01;只为记录&…

利用JS实现点击上一周或下一周却换

1.页面加载显示当前年份的第几周 效果如图&#xff1a; html代码&#xff1a; <font size"2" color"black"> <input id"btnweek5" type"button" class"btn" value"上周" οnclick"EduCommissio…

java reference 传引用_Java的引用(reference)---Roni

摘自《Java面向对象编程》一书,作者:孙卫琴 来源:www.javathinker.org在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在日常生活中&am…

C# 以管理员身份运行程序

刚看了一篇博友写的“以管理员身份运行程序”, 所以我也来写一个简单易懂的&#xff0c;简单两步搞定&#xff0c;不用写任何代码&#xff1a; 第一步&#xff1a; 右键选择项目 > 添加 > 新建项 &#xff1b; 找到 应用程序清单文件&#xff0c;后缀名为manifest&#x…

会计转行从事IT,如何在一年时间内全职学习?

2019独角兽企业重金招聘Python工程师标准>>> https://www.zhihu.com/question/21427478/answer/18227060 转载于:https://my.oschina.net/soho00147/blog/836138