原文地址 译者:刘小刘

本文漫谈java中的日志:以前怎样使用日志,以及类似SLF4J的库为我们带来了什么。

日志是创建软件时的基本需求之一,常见的用例如:

  • 软件开发过程中的调试
  • 生产环境下诊断bug
  • 出于安全目的而跟踪访问
  • 创建统计使用的数据
  • 等等

无论用途为何,日志都应该是详尽、可配置和可靠的。
历史
在早期,java日志使用System.out.println(), System.err.println() 或 e.printStackTrace()。调试信息输出到标准输出System.out,错误信息输出到标准错误System.err。在生产环境中,二者都被重定向:前者重定向到null(注:不输出),后者重定向到需要的日志文件。这种做法够用但有很大的缺点:不可配置。它是个是或否的开关,要么全记录要么完全不,不能在某一层或某个包上关注具体的日志。

Log4J充当了救星,它满足了人们对日志框架的几乎所有需求。它引入了许多日志框架中今天仍在使用的概念(它是我首个使用的框架所以请原谅我若某个概念其实不是它发明的):

  • Logger的概念,每个logger可以单独配置
  • Appender的概念,每个appender可以将日志输出到它想要的任何地方(文件、数据库、消息等等)
  • Level的概念,开发人员可以单独配置是否输出每条日志

之后,Sun意识到需要在JDK中提供日志特性,它没有直接使用Log4J,而是模仿Log4J创建了自己的API。然而,新API的完成度不及Log4J。如果你想使用JDK1.4的日志API,你可能必须创建自己的Appender-在java API中叫Handler-因为能直接用的日志目的地只有控制台和文件。

使用这些框架都需要多份配置,因为不管你选择哪个,至少有一个你的依赖会使用另一个。Apache Commons Logging是一个将它自己与日志框架连接的API桥梁。库应该调用commons-logging,这样库使用的实际框架和你的工程是相同的,而不是它强制使用的。现实不总是这样,所以Commons Logging没有解决双重配置问题。此外,Commons Logging还会遇到类加载的问题,导致NoClassDefFoundError报错。

最后,Log4J核心的开发者由于此处不便细说的原因退出了Log4J工程。他创建了另一个日志框架,这个本应成为Log4J第二版的日志框架被命名为SLF4J。

一些奇怪的事实

以下是前述框架困扰我的一些事实,它们不一定都是缺陷但值得指出来:

  • Log4J通过maven强制依赖JMS, Mail和JMX,意味着如果你不嫌麻烦特意排除它们那这些就会出现在你工程的类路径中。
  • 类似地,Commons Logging通过maven强制依赖Avalon(另一个日志框架),Log4J, LogKit和Servlet API(!)
  • Log4J中始终包含一个Swing日志查看器,即使它是用在无需展现的环境中,例如批处理或应用服务器。
  • Log4J 1.3版的主页重定向到1.2版,而2.0版还在实验室阶段。

选择哪个框架?

Log4J是可以选择的框架(对大多数)但它不再开发了。1.2版是参考,1.3版废弃了而2.0还处在它的早期阶段。
Commons Logging是作为库的好选择(相比应用),但我无法忍受类加载器的问题,一次就够了(最后,我抛开Commons Logging直接用了Log4J).
JDK1.4日志是标准而且不存在多版本共用的问题,但它缺少太多特性,如果不二次开发如数据库适配器或其它就不能使用。太糟了。。。但仍未回答这个问题:选择哪个框架?

最近,我公司的架构师决定使用SLF4J,为什么会选择它?

SLF4J
SLF4J不及Log4J使用普遍,因为许多架构师和开发者熟悉Log4J而不知道SLF4J,或不关注SLF4J而坚持使用Log4J。此外,Log4J满足了许多工程的所有日志需求。不过,有趣的是,Hibernate使用了SLF4J。它拥有一些Log4J没有的美好特性。

简单的语法

看这个Log4J示例:
Logger.debug("Hello " + name);
由于字符串拼接的问题(注:上述语句会先拼接字符串,再根据当前级别是否低于debug决定是否输出本条日志,即使不输出日志,字符串拼接操作也会执行),许多公司强制使用下面的语句,这样只有当前处于DEBUG级别时才会执行字符串拼接:
if (logger.isDebugEnabled()) {

LOGGER.debug(“Hello ” + name);
}

它避免了字符串拼接问题,但有点太繁琐了是不是?相对地,SLF4J提供下面这样简单的语法:
LOGGER.debug("Hello {}", name);
它的形式类似第一条示例,而又没有字符串拼接问题,也不像第二条那样繁琐。

SLF4J API和实现
此外,SLF4J很好地解耦了API和实现,所以你在开发环境和生产环境中使用它的API都可以极佳地适配。例如,你可以强制使用SLF4J的API,而保持生产环境中用了几年的旧的Log4J.properties文件。SLF4J的日志实现是LogKit。

SLF4J桥接
SLF4J具有桥接的特性,你可以移除你的工程及其依赖组件使用的所有Log4J和commons-logging包,只使用SLF4J。
SLF4J为每一种日志框架提供一个JAR包:它模仿其它日志框架的API但将实现引向SLF4J的API(进而使用环境中真实的框架)。一点警告:小心不要让classpath中同时出现同一种日志的桥接库和实现库,否则会陷入循环。例如,使用Log4J桥接库时,每个Log4J的API被引向SLF4J,如果SLF4J的Log4J实现同时存在,会再次引向Log4J,这样循环下去。

SLF4JAPI和Log4J实现
综合所有考虑,我的建议是使用SLF4J的API和Log4J的实现。这样,你仍像以前一样配置Log4J,但调用更简单的SLF4J接口。要这样做,你需要:

操作 位置 描述
加入classpath slf4j-api.jar* 主API,没有它就无法使用SLF4J
slf4j-log4j.jar* SLF4J的Log4J实现
jul-to-slf4j.jar* 允许重定向 JDK 1.4日志到 SLF4J
jcl-over-slf4j.jar* 重定向commons-logging调用到SLF4J
从classpath移除 commons-logging.jar* 会跟 jcl-over-slf4j.jar里的commons-logging API冲突
SLF4JBridgeHandler.install()** 主应用 重定向JDK 1.4日志调用到SLF4J
* Jar名可能包含版本
**只在你需要单一入口或少量调用

如果你的应用在应用服务器中运行,你可能需要修改它的库和/或配置来达成以上修改。
更多:
SLF4J项目
Log4J项目
Commons Logging项目
Commons Logging类加载问题

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: java日志和SLF4J随想

from: http://ifeve.com/java-slf4j-think/

java日志和SLF4J随想相关推荐

  1. java日志体系(SLF4J,JCL)

    平时我们引用日志包打印日志时发现和我们预料中的不一致,最常见的就是明明配置了但确不打印日志,所以我简单总结了下java的日志体系. 一.我们日前常用的日志有log4j,log4j2,logback,j ...

  2. SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志(转)...

    前言: 今天遇到这个sql服务无法启用 .无法登陆 的情况..在google 百度 搜了一下.发现很多网站都是采集来的数据..(很奇怪这些采集站都那么靠前!) 照着文章里边的方法去试试都不行,,,后来 ...

  3. c log 指定服务器,解决 SQL2000安装程序配置服务器失败。参考服务器错误日志和C:\WINDOWS\sqlstp.log方法...

    重新安装SQL Server 2000时错误,提示"参考服务器错误日志和 C:/WINDOWS/sqlstp.log了解更多信息 重装sql经常遇到2个问题 安装好SQL Server 20 ...

  4. 安装程序配置服务器失败。参考服务器错误日志和C:\WINDOWS\sqlstp.log

    原文地址为: 安装程序配置服务器失败.参考服务器错误日志和C:\WINDOWS\sqlstp.log 安装好SQL Server 2000安装失败提示:安装程序配置服务器失败.参考服务器错误日志和C: ...

  5. 安装 SQL Sever 2000至最后步骤报错“安装程序配置服务器失败。 参考服务器错误日志和 C: \Windows\sqltsp.log 了解更多信息”

    在安装 SQL Sever 2000至最后步骤报错"安装程序配置服务器失败. 参考服务器错误日志和 C: \Windows\sqltsp.log 了解更多信息" ,如 图: 解决方 ...

  6. 安装程序配置服务器失败。参考服务器错误日志和C:/WINDOWS/sqlstp.log

    安装好SQL Server 2000安装失败提示:安装程序配置服务器失败.参考服务器错误日志和C:/WINDOWS/sqlstp.log 解决方法: Google了一下可能是安装目录有文件,删除了[C ...

  7. 安装sql server 2000时又出现:安装程序配置服务器失败。参考服务器错误日志和 C:/WINNT/sqlstp.log 了解更多信息。

    安装程序配置服务器失败.参考服务器错误日志和 C:/WINNT/sqlstp.log 了解更多信息. 查看日志文件;发现是以下问题: driver={sql server};server=ZHL;UI ...

  8. 安装程序配置服务器失败。参考服务器错误日志和 C:/WINDOWS/sqlstp.log 了解更多信息。

    MSSQL安装不上,会出现安装程序配置服务器失败.参考服务器错误日志和 C:/WINDOWS/sqlstp.log 了解更多信息. 最简单的处理方法就是直接把计算机名改成大写即可: 如果修改成大写,重 ...

  9. 安装SQL2000时出现:安装程序配置服务器失败。参考服务器错误日志和 C:/WINDOWS/sqlstp.log 了解更多信息。

    当你想重装sql server,而安装时又出现"您的机子上已经安装有一个实例"的提示时,可以删除program files/Microsoft SQL Server文件夹和注册表信 ...

最新文章

  1. 使用MASM03 - Win32汇编语言011
  2. Linux centos7 Linux网络相关、firewalld和netfilter、netfilter5表5链介绍、iptables语法
  3. 实战SSM_O2O商铺_05集成SSM后验证DAO层、Service层、Controller层的配置
  4. C++ #pragma comment语法(预处理指令)
  5. 面试不懂分布式锁?那得多吃亏
  6. 计算机应用能力考试用书有哪些,全国专业技术人员计算机应用能力考试用书
  7. Visual Studio Code 1.45 发布
  8. 裘宗燕:C/C++ 语言中的表达式求值
  9. 苹果无线网服务器绕过id,最新绕过苹果id方法
  10. centos7磁盘分区格式化
  11. 史上最简单的制作安装系统U盘工具
  12. ue4中特殊的Actors,以及Actor与Component的关系
  13. 论文-Estimation–Action–Reflection: Towards Deep Interaction Between Conversational and Recommender Sys
  14. kubeadm重新生成admin.conf
  15. 汽车一键启动 汽车手机远程启动系统  汽车无钥匙进入 手机APP控车智能防盗
  16. mac 设置阿里企业邮箱
  17. 系统(HTML页面)设置icon图标
  18. 谷歌关键词是怎么排名的?google关键词优化
  19. AcWing 913. 排队打水 (排序不等式)
  20. L2-040 哲哲打游戏 (25 分)动态数组 纯模拟

热门文章

  1. git fetch和git pull之间的区别--转载
  2. quartz 报错:java.lang.classNotFoundException
  3. 【风控模型】Logistic算法构建标准信用评分卡模型python代码案例
  4. 微软 CTO 韦青:对微软这样已经走过44年的公司,现在也只是个小小小的开始!!!
  5. 谷歌I/O走进TensorFlow开源模型世界:从图像识别到语义理解
  6. jvm性能调优 - 03垃圾回收机制
  7. Apache ZooKeeper - 使用Apache Curator操作ZK
  8. SpringBoot配置嵌入式Servlet容器
  9. 如何修改cmd控制台默认编码为utf-8
  10. jvm监控工具(排查内存溢出和内存泄漏)