ref:http://blog.mayongfa.cn/267.html

阿里巴巴 Java 开发手册

前几天阿里巴巴在云栖社区首次公开阿里官方Java代码规范标准,就是一个PDF手册,有命名规范,让你知道自己原来取的每一个类名、变量名都是烂名字,真替你家未来孩子担心;有集合处理、并发处理、OOM/NPE 异常、魔法值等等好多规范,什么?你不知道什么是魔法值,算了,我也是第一次听说:即未经定义的常量;还有一个关于 Map 遍历的推荐,这个大家应该都知道,推荐使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。 因为 keySet 是遍历了 2 次,而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。还有接口类中的方法和属性不要加任何修饰符号(public 也不要加)这些推荐做法,这些都没什么,日常开发中应该做到的规范,但下面这个【强制】,我发现我接触的项目都没做到。

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API

在手册中的日志规约中,看到有一条这样的规定,说实话我有点懵逼, Log4j 不是 Java 中应用最广的日志系统么?为啥不让用?

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);

在这段规约中看到了推荐使用 SLF4J 这个日志框架,而且还是毫不由分说的【强制】,那它到底好在什么地方?

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。来自百科里的描述

大概意思就是说 SLF4J 是一个日志抽象层,允许你使用任何一个日志系统,并且可以随时切换还不需要动到已经写好的程序(我特么是真改过整个项目的所有打印日志的代码,累死...),这对于第三方组件的引入的不同日志系统来说几乎零学习成本了,况且它的优点不仅仅这一个而已,还有简洁的占位符的使用和日志级别的判断,众所周知的日志读写一定会影响系统的性能,但这些特性都是对系统性能友好的。官网地址:https://www.slf4j.org/

少废话,你来测试一下

说了辣么多,下面我就将建立一个项目,是 Maven 项目哦,并用 SLF4J 来结合 JDK14、Simple、Logback、Log4j做日志系统,在上述几个日志系统间随意切换,而且不修改一行代码,甚至不用修改一个字符。

1.首先建立一个简单的 Java 项目(Maven Project),目录结构如下:

2.在 pom.xml 中增加 SLF4J API 依赖包
使用的目前最新稳定版 1.7.22 的 SLF4J:

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-api</artifactId>
  4. <version>1.7.22</version>
  5. </dependency>

jar 包: slf4j-api-1.7.22.jar
接着并在测试项目中的 App.java 中加入日志输出代码,代码如下:

  1. package xyz.mafly.SLF4JTest;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. /**
  5. * Hello world!
  6. *
  7. */
  8. public class App {
  9. final Logger logger = LoggerFactory.getLogger(App.class);
  10. private void test() {
  11. logger.info("这是一条日志信息 - {}", "mafly");
  12. }
  13. public static void main(String[] args) {
  14. App app = new App();
  15. app.test();
  16. System.out.println("Hello World!");
  17. }
  18. }

到这里,代码就写完了、写完了。以后无论在 Log4j 还是 Logback 日志系统切换,都不需要修改这里的代码!一个字符都不需要!!

3. JDK14 日志系统,slf4j-jdk14
pom.xml 中增加 slf4j-jdk14 依赖包:

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-jdk14</artifactId>
  4. <version>1.7.22</version>
  5. </dependency>

jar 包: slf4j-jdk14-1.7.22.jar
运行程序,即可看到如下图输出:

4. Simple 日志系统,slf4j-simple
在 pom.xml 中注释掉 JDK14 包节点,增加 slf4j-simple 依赖包:

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-simple</artifactId>
  4. <version>1.7.22</version>
  5. </dependency>

jar 包: slf4j-simple-1.7.22.jar
运行程序,即可看到如下图不同输出:

5. Log4j 日志系统(最常用), slf4j-log4j
依然是在 pom.xml 中注释掉 Simple 包节点,增加 slf4j-log4j12 依赖包:

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-log4j12</artifactId>
  4. <version>1.7.22</version>
  5. </dependency>

jar 包: slf4j-log4j12-1.7.22.jar、 log4j-1.2.17.jar

Log4j 除了导入 jar 包后,还需要增加一下日志格式的配置文件,我新增了一个log4j.properties的日志配置文件,具体 Log4j 详细配置我之前在 《log4j 项目中的详细配置》 这篇博客中写过。运行程序,即可看到如下图输出(输出格式可自己配置):

6. Logback 日志系统, slf4j-logback
在 pom.xml 中注释掉 Log4j 包节点,增加 slf4j-logback 依赖包:

  1. <dependency>
  2. <groupId>ch.qos.logback</groupId>
  3. <artifactId>logback-core</artifactId>
  4. <version>1.1.9</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-classic</artifactId>
  9. <version>1.1.9</version>
  10. </dependency>

jar 包: logback-core-1.1.9.jarlogback-classic-1.1.9.jar
运行程序,也可看到如下图日志输出:

总结一下

看完阿里巴巴的这个开发手册,的确学到了一些新知识和规范,SLF4J 只是其中一个知识点而已。
说回 SLF4J 这个日志框架,在下一个开源项目或内部类库中都强烈推荐使用 SLF4J ,它的好处不言而喻,这也是阿里巴巴强制使用的原因所在。希望这篇文章对你的项目中日志系统有所帮助,任何一个任何编程语言的开发者,都应该重视日志的重要性和编码规范,对你、团队和未来阅读你代码的人都好,相信我,他们肯定会感激你的。

ref:下一个项目为什么要用 SLF4J的更多相关文章

  1. 下一个项目为什么要用 SLF4J

    阿里巴巴 Java 开发手册 前几天阿里巴巴在云栖社区首次公开阿里官方Java代码规范标准,就是一个PDF手册,有命名规范,让你知道自己原来取的每一个类名.变量名都是烂名字,真替你家未来孩子担心:有集 ...

  2. 为你下一个项目准备的 50 个 Bootstrap 插件

    Bootstrap是快速开发Web应用程序的前端工具包.它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的版式,表单,buttons,表格,网格系统等等. 本文向你 ...

  3. 在IIS EXPRESS下运行一个visual studio 项目,跳转到另一个项目的解决方案。

    原因是因为以前有一个项目也是3690端口,然后在3690端口上建立了一个网站,现在的新网站也是用的3690端口,那么会调用以前网站的WEB.CONFIG文件. 解决方法,右键单击网站,然后选择属性.在 ...

  4. vue 快速入门 系列 —— 使用 vue-cli 3 搭建一个项目(下)

    其他章节请看: vue 快速入门 系列 使用 vue-cli 3 搭建一个项目(下) 上篇 我们已经成功引入 element-ui.axios.mock.iconfont.nprogress,本篇继续 ...

  5. IDEA项目搭建十——使用slf4j和logback进行日志记录

    .简介 java里面日志分为两部分一个门面.一个实现,我们所熟知的SLF4j.Log4j.Log4j2.Logback的日志组件slf4j是门面提供的统一的入口,具体实现由log4j.log4j2.l ...

  6. eclipse下maven项目保持原有目录结构配置resin运行环境

    maven项目用起来很方便,但是它的目录结构和eclipse的目录结构是有区别的,故而在eclipse下的maven项目,直接运行调试是有一些问题的. 为了方便maven项目的运行调试,因而也就有了像 ...

  7. NASA的下一个十年(译)

    原文 MICHAEL ROSTON (New York Times) 从左起:木卫二:土卫六:经过火星的水手谷星的合成图:金星的拼接图 大多数人已经从人类第一次近距离看到冥王星的兴奋中冷静下来.下一个 ...

  8. SQL Server获取下一个编码字符串的实现方案分割和进位

        我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...

  9. GitHub入门之二 参与一个项目编写

    接上文:大多数时候我们也需要把别人的代码进行整合和修改,而不是简单的修改,这时就需要对一个项目进行修改. 注意,本系列文章主要说明在github网站上的操作,更多高级操作请使用git控制台 一.for ...

随机推荐

  1. 洛谷P3960 [NOIP2017] 列队

    数据结构题还是挺好玩的 注意到每次只变动三个点:(x,y),(x,m),(n,m),其他地方都是整块移动. 可以开n+1个线段树,前n个存每行前m-1个人,最后一个存第m列的人. (x,y)位置的人出 ...

  2. 训练赛第二场G题 ZOJ 2343

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2343 解题报告:首先我假设最后的正确的结果是a[1] , a[2 ...

  3. C++传递二维数字给一个自定义函数

    如果参数是多维数组,那么参数必须指明第一维意外得所有未得长度:比如你的 void tt(char a[][20])或者 void tt(char (*a)[20]) 另外这样也是可以的char *a[ ...

  4. promise顺序执行,返回结果存放在数组

    遇到面试的一个编程题:三个返回promise对象的异步操作,让你写一个函数可以将这些操作顺序执行,并返回一个数组包含三个异步对象的结果 异步对象: // 异步函数a var a = function ...

  5. 莫队-小Z的袜子

    ----普通莫队 首先清楚概率怎么求假设我们要求从区间l到r中拿出一对袜子的概率sum[i]为第i种袜子在l到r中的数量 $$\frac{\sum_{i=l}^{r} {[sum[i] \times ...

  6. 字符串hash&&对字符串hash的理解

     对字符串hash的一些总结: 1,首先,我们在转化的时候,取底的时候一般是取131这些数,因为要避免不同的字符串对应相同的hash值这种情况的出现.如果卡精度的时候,我们可以采取双模数的方式尽量减少 ...

  7. std::max 错误

    Today I typed the following: int t = (std::max)(timeout, lagtime); Why did I put parentheses around ...

  8. hdu 确定比赛名次(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    ...

  9. [转]C++ 取代switch的三种方法

    1.常规switch enum EnumType { enumOne, enumTwo, enumThree }; void showMessage(int type) { switch(type) ...

  10. 网页中嵌入swf文件的几种方法

    1. object + embed       传统的方法 优点:浏览器兼容性好,是 Macromedia 一直以来的官方方法缺点:a.embed 标签是不符合 W3C 的规范的,无法通过验证.当然, ...