ref:下一个项目为什么要用 SLF4J

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),目录结构如下:

SLF4J_ProjectTree.png

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
运行程序,即可看到如下图输出:

slf4j_jdk14.png

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
运行程序,即可看到如下图不同输出:

slf4j_simple.png

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 项目中的详细配置》 这篇博客中写过。运行程序,即可看到如下图输出(输出格式可自己配置):

slf4j_log4j.png

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_logback.png

总结一下

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

转载于:https://www.cnblogs.com/studyskill/p/9558084.html

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

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

相关文章

洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)

题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc.h> #define R register #define inline __inline__ __attribute__((always_inline)) #define fp(i,a,b) for(R int i(a),I(b)1;i<I;i) #define fd(i,a,b) for(R int i(a),I(b)-1;i>I;--i) #define …

计算机突然蓝屏无法启动_为什么计算机无法立即启动?

计算机突然蓝屏无法启动With the newer, more powerful hardware and improved operating systems that we have available to use these days, why does it still take as long as it does to fully boot a computer up each time? 借助我们如今可以使用的更新&#xff0c;更…

CCNA课堂练习:OSPF的介绍及配置

CCNA浅谈OSPF的配置 今天我们来谈谈路由器OSPF的配置&#xff0c;那我先来介绍一下OSPF的特点&#xff1a;1、对网络发生的变化能够快速响应2、当网络发生变化的时候发送触发式更新•3、支持VLAN 4、管理方便ospf引用了区域的概念&#xff0c;区域分两种&#xff1a;1、骨干区域…

vcenter 6.7 (vcsa)部署指南

闲言少叙&#xff0c;直达心灵。 一、部署提要1.1 vCenter Server Appliance(VCSA )6.7下载地址https://pan.baidu.com/s/1WUShsC23E2qIIBg7MPR87w 6lzb 二、安装部署VCSA分为两个阶段安装&#xff0c;下面我们开始第一阶段2.1 打开之后&#xff0c;直接点击安装按钮2.2部署设备…

如何停止Internet Explorer 11的建议站点?

Internet Explorer automatically suggests addresses and search results based on the partial address you’re typing out. If this feature irritates you, read on as we learn how to turn it off. Internet Explorer会根据您键入的部分地址自动建议地址和搜索结果。 如…

什么是SG?+SG模板

先&#xff0c;定义一下 状态Position P 先手必败 N x先手必胜 操作方法&#xff1a; 反向转移 相同状态 不同位置 的一对 相当于无 对于ICG游戏&#xff0c;我们可以将游戏中每一个可能发生的局面表示为一个点。并且若存在局面i和局面j&#xff0c;且j是i的后继局面(即局面i可…

【桌面虚拟化】之三 Persistent vs NonP

作者&#xff1a;范军 &#xff08;Frank Fan&#xff09; 新浪微博&#xff1a;frankfan7 在【桌面虚拟化】之二类型及案例中我们探讨了桌面虚拟化的两种架构&#xff0c;HostedVirtual Desktop (VDI) 和 Published Desktop/App. 本文深入分析其中VDI的两种桌面类型&#xff0…

H5 video 开发问题及相关知识点

相关链接&#xff1a;H5 video 的使用H5 video 全屏播放♢ video点播与直播H5 video目前所有浏览器都支持的视频格式是MP4格式&#xff0c;所以mp4应当是点播web视频的首选格式。而在直播视频上&#xff0c;H5 video只在移动端原生支持HLS流的直播视频(Mac safari video标签也支…

Mybatis-Generator自动生成XML文件以及接口和实体类

整合了MySQL和Oracle配置文件生成方法 这个是整个文件夹的下载地址&#xff1a;http://www.codepeople.cn/download 主要给大家介绍一下generatorConfig.xml文件的配置&#xff0c;以及生成后的文件。 generatorConfig.xml <?xml version"1.0" encoding"UTF…

如何在Windows 10上设置默认Linux发行版

Windows 10 now allows you to install multiple Linux environments, starting with the Fall Creators Update. If you have multiple Linux environments, you can set your default and switch between them. Windows 10现在允许您从Fall Creators Update开始安装多个Linux…

mysql全备份+增量备份笔记总结

备份基础知识 冷备&#xff08;cold backup&#xff09;&#xff1a;需要关mysql服务&#xff0c;读写请求均不允许状态下进行&#xff1b; 温备&#xff08;warm backup&#xff09;&#xff1a; 服务在线&#xff0c;但仅支持读请求&#xff0c;不允许写请求&#xff1b; 热备…

pjax学习

PJAX 介绍 红薯 发布于 2012/04/11 22:06阅读 61K收藏 116评论 11jQuery.Pjax kissy开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f;->>> 介绍 pushState是一个可以操作history的api&#xff0c;该api的介绍和使用请见这里&#xff1a…

SQL Server 2000详细安装过程及配置

说明&#xff1a;这篇文章是几年前我发布在网易博客当中的原创文章&#xff0c;但由于网易博客现在要停止运营了&#xff0c;所以我就把这篇文章搬了过来&#xff0c;虽然现如今SQL Server 2000软件早已经过时了&#xff0c;但仍然有一部分人在使用它&#xff0c;尤其是某些高校…

移动应用ios和网页应用_如何在iOS上一次移动多个应用

移动应用ios和网页应用Apple doesn’t really believe in detailed instruction manuals, so some handy tricks slip through the cracks. One such trick we’ve recently discovered is that you can move multiple app icons at once on iOS. Here’s how. Apple并不真正相…

如何将内核静态库编译连接到驱动程序中去【转】

转自&#xff1a;http://blog.csdn.net/ganjianfeng2003/article/details/8089551 如何将内核静态库编译连接到驱动程序中去 2010-12-07 08:27 331人阅读 评论(1) 收藏 举报 http://blog.chinaunix.net/u2/61663/showart_2404744.html 刚上邮箱的时候发现一位网友向我询问这个问…

2018-2019 20165226 Exp9 Web安全基础

2018-2019 20165226 Exp9 Web安全基础 目录 一、实验内容说明及基础问题回答 二、实验过程 Webgoat准备XSS攻击 ① Phishing with XSS 跨站脚本钓鱼攻击② Stored XSS Attacks 存储型XSS攻击③ Reflected XSS Attacks 反射型XSS攻击 CSRF攻击 ① Cross Site Request Forgery(CS…

用 git 同步 Colab 与 Gitlab、Github 之间的文件

Colab 是谷歌提供的免费 Jupyter 服务&#xff0c;可使用 GPU。但由于每次的 VM &#xff08;虚拟机&#xff09;登出后所有文件都会连同&#xff36;&#xff2d;被毁掉。如何将一个项目里的程序或数据同步到 Colab则往往比较麻烦。尽管谷歌盘也可以挂到 Colab 里用&#xff0…

keep-alive使用_如何使用Google Keep进行无忧笔记

keep-alive使用There are a lot of note-taking apps out there. Google Keep may not be as powerful as services like Evernote, but its value is in its simplicity. Let’s talk about how to make the most of it. 那里有很多笔记应用程序。 Google Keep可能不如Evernot…

ZedGraph在项目中的应用

ZedGraph在项目中的应用将数据库数据提取出来&#xff0c;显示成曲线图&#xff08;饼状、柱状或立体图&#xff09;是项目中最常见的需求。 网上搜索到的解决方法&#xff0c;大多归为两类&#xff0c;一种是利用ActiveX组件&#xff0c;另一种是使用.net框架自带的画图的类。…

TCP/IP:IP多播选路

本节主要讨论多播选路&#xff0c;是在整个互联网上的多播&#xff0c;我们将讨论mrouted程序的执行&#xff0c;该程序计算多播路由表&#xff0c;以及再网络之间转发多播数据包的内核函数。 多播输出处理 这个和IGMP的输出处理类似&#xff0c;主要要注意有环回的多播输出和没…