[JAVA]SLF4J及其实现类框架使用简介
SLF4J介绍
SLF4J是Simple Logging Facade for Java 的简写,读法就是一个字母一个字母的读(官网的介绍视频就是这么读的)。SLF4J是一个接口,规定了一些记录日志的操作,有很多框架实现了该接口,比如:
- java.util.logging
- logback
- log4j
SLF4J需要配合这些实现框架才能使用
SLF4J使用
pom文件中引入slf4j-api
并编写如下代码测试:
public class App
{
private static final Logger logger = LoggerFactory.getLogger(App.class);
public static void main( String[] args )
{
logger.info("log test");
System.out.println( "Hello World!" );
}
}
结果如下:
Connected to the target VM, address: '127.0.0.1:54370', transport: 'socket'
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.
Hello World!
提示没有绑定logger实现类,正如前文所说,SLF4J只是一个接口,并没有具体实现,它的实现依赖于各个框架,如果要正确使用,还需要引入相应的实现框架,下面介绍几种开发中常用的实现了SLF4J接口的框架
1. slf4j-simple
slf4j-simple是比较简单的SFL4J接口的实现,只需引入slf4j-api,不需要配置即可使用
pom文件:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
运行结果:
Connected to the target VM, address: '127.0.0.1:54905', transport: 'socket'
[main] INFO zhengxl.App - test log
Hello World!
2. logback
logback的ch.qos.logback.classic.Logger
类直接实现了SLF4J的org.slf4j.Logger
接口,所以他俩可以无缝搭配,建议采用该方式。
最简单的使用方式就是让logback使用默认配置,在没有logback.xml配置文件的情况下,logback会默认调用 BasicConfigurator
初始化一个最小配置。
pom文件:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>2
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
运行结果:
Connected to the target VM, address: '127.0.0.1:63141', transport: 'socket'
17:37:56.561 [main] INFO zhengxl.App - log test
Hello World!
3. log4j
要在SFL4J框架下使用log4j,需要用到slf4j-log4j12桥接起来。
pom:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
这里还需要增加log4j的配置文件:
log4j.properties
log4j.rootLogger=TRACE, STDOUT, ERRLOG
log4j.appender.encoding=UTF-8
#log to console
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.Threshold=DEBUG
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=[%d][%-5p] (%F:%L) - %m%n
#log to file
log4j.appender.ERRLOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERRLOG.Threshold=TRACE
log4j.appender.ERRLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.ERRLOG.layout.ConversionPattern=[%d][%-5p] (%F:%L) - %m%n
log4j.appender.ERRLOG.file=logs/error.log
log4j.appender.ERRLOG.DatePattern=-yyyyMMdd
运行结果:
[2020-02-12 23:48:53,454][INFO ] (App.java:17) - log test
Hello World!
4. slf4j-nop
该框架可以静默丢弃一切日志
pom:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.30</version>
</dependency>
运行结果:
Connected to the target VM, address: '127.0.0.1:65372', transport: 'socket'
Hello World!
SLF4J 最佳实践
在java语言中,由于String是不可变的,所以用 +
拼接字符效率非常低,SFL4J考虑到了这个问题,提供了占位符的方式来记录日志,最佳实践如下:
String name = "zhengxl5566";
Integer age = 18;
logger.info("hello!,{},{}",name,age);
输出:
[2020-02-12 23:53:12,078][INFO ] (App.java:20) - hello!,zhengxl5566,18
参考
[JAVA]SLF4J及其实现类框架使用简介的更多相关文章
- java容器(二) Map类框架图解
- java容器(一) Collection类框架图解
- lombok+slf4j+logback SLF4J和Logback日志框架详解
maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...
- java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)
我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...
- JAVA(四)类集/枚举
成鹏致远 | lcw.cnblog.com |2014-02-04 JAVA类集 1.认识类集 类集的作用 类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充 类集的 ...
- Java实现简单的RPC框架(美团面试)
一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...
- SLF4J和Logback日志框架详解
SLF4J和Logback日志框架详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 本文讲述SLF4J和Logback日志框架. SLF4J是一套 ...
- Java Slf4j日志配置输出到文件中
1.概述 新项目需要增加日志需求,所以网上找了下日志配置,需求是将日志保存到指定文件中.网上找了下文章,发现没有特别完整的文章,下面自己整理下. 1.Java日志概述 对于一个应用程序来说日志记录是必 ...
- Java程序日志:java.util.logging.Logger类
一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...
随机推荐
- String 的格式化
使用场景 用于生成redis等key-value 结构的key的格式化,方便管理 eg: String.format(RedisKeys.PURCHASE_ADD_BABY_LOCK,form.get ...
- Java 切割字符串的几种方式
按效率排: 1.StringTokenizer切割 是java.util中的一个类,包含的api有: StringTokenizer的方法请参考上一篇. 其中,countTokens为length:n ...
- Linux MySQL集群搭建之主从复制
前期准备 准备两台Linux,一主,一从,具体Linux安装MySQL操作步骤:点我直达 集群搭建 注意事项 一主可以多从 一从只能一主 关闭主从机器的防火墙策略 chkconfig iptables ...
- rust 神奇的特质
pub trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> Strin ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- Linux工具之开发调试命令
目录 gcc gdb vim pmap pstack strace readelf objdump ldd gcc 详见 gcc -E 只预处理 gcc -S 生成汇编代码 gcc -c 生成可重定向 ...
- JavaWeb网上图书商城完整项目--day02-12.激活功能各层实现
1.我们来看程序的代码 数据库层: 1.通过激活码查找到对应的用户 2.设置用户的激活状态 2.业务层 1.通过数据库接口通过验证码得到对应的用户 2.判断当用户是否为空,如果没有通过激活码查找到对应 ...
- Python3-设计模式-迭代器模式
Python3中的迭代器 迭代器模式主要是访问集合元素的一中方式,迭代器不会把整个集合对象加载到内存,而是按照顺序将集合中的元素一个一个的进行迭代,这样每次迭代的时候只取少量的元素,比较省内存 注: ...
- Python3-paramiko模块-基于SSH的远程连接模块
Python3中的paramiko模块,基于SSH用于连接远程服务器并执行相关操作 http://docs.paramiko.org/en/2.1/ SSHClient 用于连接远程服务器并执行基本命 ...
- 无题II HDU - 2236 【二分图+二分答案】
题目 这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. Input 输入一个整数T表示T组数据. 对于每组数据第一行输入一 ...