SLF4J的使用和Log4j的配置

SLF4J 简介

完整用户手册请异步:SLF4J 使用手册

SLF4J是Simple Logging Facade for Java的简写,即Java简单日志门面,用来服务于各种各样的日志框架,比如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“。

public class HelloWorld {

public static void main(String[] args) {

Logger logger = LoggerFactory.getLogger(HelloWorld.class);

logger.info("Hello World");

}

}

编译运行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?”获取更多细节。

public class Wombat {

final Logger logger = LoggerFactory.getLogger(Wombat.class);

Integer t;

Integer oldT;

public void setTemperature(Integer temperature) {

oldT = t;

t = temperature;

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

if(temperature.intValue() > 50) {

logger.info("Temperature has risen above 50 degrees.");

}

}

public static void main(String[] args) {

new Wombat().setTemperature(60);

}

}

在部署时绑定一个日志框架

像在之前提到过的,SLF4J支持各种各样的日志框架。SLF4J的发行版附带的几个jar被称为” SLF4J bindings“ ,每个绑定都对应一个支持的框架。

切换日志框架,只需要替换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接口进行编程。因此,终端用户在部署时可以通过在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的目的。注意,在绑定上声明一个非传递性的依赖,比如说 对测试,不影响终端用户。

内嵌组件中SLF4J的使用也在FAQ中进行讨论。有关系的章节: logging configuration dependency reduction testing

声明项目的日志依赖

鉴于Maven的传递依赖规则,对于”regular“项目(不是库和框架),日志依赖声明 可以通过一个单独的依赖声明来实现。

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

通过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信息,但是不能强迫用户依赖这些日志框架。

关于MDC的更多信息参见 chapter on MDC

Log4J xml配置

java slf4j log4j_SLF4J和log4j的使用相关推荐

  1. [转载]为什么使用 SLF4J 而不是Log4J来做Java 日志

    转载自<http://www.oschina.net/translate/why-use-sl4j-over-log4j-for-logging> 每个Java开发人员都知道日志记录对Ja ...

  2. 为什么使用 SLF4J 而不是 Log4J 来做 Java 日志

    每个Java开发人员都知道日志记录对Java应用的重要性,尤其是对服务端应用,而且其中许多人都已经熟悉了各种记录日志的库,比如java.util.logging,Apache的log4j,logbac ...

  3. java slf4j日志框架_SLF4J - 日志框架 - 类库 - Java - 代码树

    JAVA简易日志门面(Simple Logging Facade for Java,缩写SLF4J),是一套包装Logging 框架的界面程式,以外观模式实现.可以在软件部署的时候决定要使用的 Log ...

  4. slf4j 使用 java_[JAVA]SLF4J及其实现类框架使用简介

    SLF4J介绍 SLF4J是Simple Logging Facade for Java 的简写,读法就是一个字母一个字母的读(官网的介绍视频就是这么读的).SLF4J是一个接口,规定了一些记录日志的 ...

  5. Java学习笔记之log4j与commons-logging转

    Java学习笔记之log4j与commons-logging<转> (2011-02-16 11:10:46) 转载▼ 标签: 杂谈 分类: 技术学习之其他 Logger来自log4j自己 ...

  6. 【Java编程系列】log4j配置日志按级别分别生成日志文件

    热门系列: [Java编程系列]WebService的使用 [Java编程系列]在Spring MVC中使用工具类调用Service层时,Service类为null如何解决 [Java编程系列]Spr ...

  7. java运行提示没有 org/slf4j/LoggerFactory 或者 log4j

    问题描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 解决 ...

  8. java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出

    ===============>>#1 票数:41 已采纳 使用slf4j无法做到这slf4j . 我想,缺少这个功能的原因是,几乎不可能为slf4j构建一个Level类型,它可以有效地映 ...

  9. java web项目使用log4j的使用笔记

    2019独角兽企业重金招聘Python工程师标准>>> 新建一个JAVA WEB 项目,就是一个动态网站. 例名字为sms (一)去http://logging.apache.org ...

最新文章

  1. python 多边形曲线
  2. 10元权限gm游戏_游戏P图超能打!揭秘10年老本儿500元升级计划
  3. Struts2文件上传
  4. java 把依赖打到一个整体jar包里运行(maven)
  5. 【C语言简单说】二十:指针基础
  6. android adb 开机广播,Android中常用的adb指令
  7. 自定义xadmin后台首页
  8. 北京小哥在日本召唤出机器飞龙,拿下ICRA 2018最佳无人机论文
  9. 常见在线密码解析网站
  10. 微信快速引流的18种加人方法秘籍
  11. 简单工厂模式、工厂模式以及抽象工厂模式(具体)
  12. 注册表删除windows开机启动项
  13. react + better-scroll 横向滚动案例
  14. java上机练习题,java上机练习题
  15. c语言dsp编程论坛,针对Ti的DSP C语言编程
  16. MySQL - SELECT LAST_INSERT_ID() 使用总结
  17. 关于ireport中文不显示问题
  18. Tacotron2 NVIDIA版本使用Biao-Bei数据集
  19. 让你的照片动起来!四种方法制作照片音乐视频
  20. 最后一本书 第六章课后练习3,4

热门文章

  1. 小程序电话号码邮政编码正则验证
  2. 青岛软件企业认定的要求
  3. eclipse paho java_MQTT研究之EMQ:【eclipse的paho之java客户端使用注意事项】
  4. 微信小程序快速建立列表
  5. 基于PL角度理解BSM模型
  6. 【送书】Preact(React)核心原理详解
  7. 二极管专题:二极管种类及其作用
  8. pert2型管的连接方式
  9. Java反射原理与使用
  10. 正则表达式匹配汉字/英文(数字)