简介
在编写程序的过程中,发现程序运行结果与预期不符,这时怎么办呢?以前的做法是用System.out.println()调试,可是调好以后还要删了,出错了又要重写,如此反复很麻烦,但现在有更好的解决方法,那就是使用日志
日志的优点
可以设置输出样式,避免每次都写"ERROR: " + var;
可以设置输出级别,禁止某些级别输出。例如,只输出错误日志;
可以被重定向到文件,这样可以在程序运行结束后查看日志并追踪问题;
可以根据配置文件调整日志,无需修改代码
可以按包名控制日志级别,只输出某些包打的日志;
日志工具
java.util.logging
这是Java标准库内置的日志包,共有七个日志级别(从严重到普通):SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST
默认级别是INFO,因此,INFO级别以下的日志,不会被打印出来。使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。
简单应用
第一步:通过Logger.getLogger获取Logger类的实例
第二步,使用Logger实例的方法打日志
import java.util.logging.Logger;
public class Main {
public static void main(String[] args) {
Logger logger = Logger.getLogger(Main.class.getName());
logger.info("Start process...");
logger.info("Process end.");
}
}
1
2
3
4
5
6
7
8
9
java.util.logging的局限
Logging系统在JVM启动时读取配置文件并完成初始化,一旦开始运行main()方法,就无法修改配置;
配置不太方便,需要在JVM启动时传递参数-Djava.util.logging.config.file=<config-file-name> 因此,Java标准库内置的Logging使用并不是非常广泛。
Apache Commons Logging(JCL)
之前叫Jakarta Commons Logging,简称JCL,现在名称为Apache Commons Logging,Commons Logging是一个第三方日志库,是日志接口,日志实现有很多方法,最常见的就是Log4j,它是由Apache创建的日志模块。Commons Logging的特色是,它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons LogginJCL动态查找(绑定)并使用Log4j日志组件(Log4j是另一个流行的日志系统),如果没有找到Log4j,再使用默认的JDK Logging。共六个日志级别:FATAL、ERROR、WARNING、INFO、DEBUG、TRACE,默认级别也是INFO
Commons Logging的优势
Commons Logging是使用最广泛的日志模块(除了SLF4J)
Commons Logging的API非常简单
Commons Logging可以自动检测并使用其他日志模块
简单应用
第一步:通过LogFactory.getLog获取Log类的实例
第二步,使用Log实例的方法打日志(因为Commons Logging是第三方库,所以需要自行下载配置)
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main {
public static void main(String[] args) {
Log log = LogFactory.getLog(Main.class);
log.info("start...");
log.warn("end.");
}
}
1
2
3
4
5
6
7
8
9
10
Log4j
前面介绍了Commons Logging,可以作为“日志接口”来使用。而真正的“日志实现”可以使用Log4j。Log4j是一种非常流行的日志框架,它的架构大致如下:
当我们使用Log4j输出一条日志时,Log4j自动通过不同的Appender把同一条日志输出到不同的目的地。例如:
console:输出到屏幕;
file:输出到文件;
socket:通过网络输出到远程计算机;
jdbc:输出到数据库
在输出日志的过程中,通过Filter来过滤哪些log需要被输出,哪些log不需要被输出。最后,通过Layout来格式化日志信息,例如,自动添加日期、时间、方法名称等信息。上述结构虽然复杂,但我们在实际使用的时候,并不需要关心Log4j的API,只需要配置好配置文件,并放到相应路径下即可,Log4j会去读取配置文件并按照我们的配置要求来输出日志。(注:只有扩展Log4j时,才需要引用Log4j的接口。例如:将日志加密写入数据库的功能,需要自己开发)
SLF4J和Logback
前面说了Commons Logging和Log4j这一对好基友,接下来说SLF4J(Simple Logging Facade for Java)和Logback,SLF4J类似于Commons Logging,也是一个日志接口,而Logback类似于Log4j,是一个日志的实现。那么问题来了,有了Commons Logging和Log4j为什么还要用SLF4J和Logback呢?简单来说就是,有人对Commons Logging的接口不满意,就搞了SLF4J,对Log4j的性能不满意,就搞了Logback。不用纠结怎么选,不懂选SLF4J就对了,现在开源项目也大多用的SLF4J,SLF4J和Logback可以取代Commons Logging和Log4j ! 这也是SLF4J作者的目的,即使有新更新的其它日志组件,它也能适应。如需要某一种特殊的日志实现,使用SLF4J的桥接包就行了(logback是slf4j-api的天然实现,不用桥接包),故即使现在只需要一种日志组件,为了可能的扩展,也要养成好习惯而使用SLF4J
Commons Logging和SLF4J接口对比
不同之处就是Log变成了Logger,LogFactory变成了LoggerFactory。(写程序时注意导包,别导错了)
SLF4J的总结:
无论你选用哪个日志组件,在你的应用中,都应当使用slf4j作为统一的API,好处是可以很方便的切换底层实现。
简单应用
这里用SpringBoot整合SLF4J和Logback,SpringBoot默认支持Logback,所以无需引用三方包,只需要配置application.properties即可,如果想要功能丰富些,则最好配置下logback.xml文件。
介绍下配置
日志格式
时间日期:精确到毫秒,可以用于排序
日志级别:ERROR、WARN、INFO、DEBUG、TRACE
进程ID
分隔符:采用 --- 来标识日志开始部分
线程名:方括号括起来(可能会截断控制台输出)
Logger名:通常使用源代码的类名
日志内容:我们输出的消息
1
2
3
4
5
6
7
日志输出方式
logging.pattern.console: 定义输出到控制台的格式(不支持JDK Logger)
logging.pattern.file: 定义输出到文件的格式(不支持JDK Logger)
文件日志
SpringBoot默认只输出控制台,不输出文件,通过下面配置添加文件日志输出
logging.file.path: 写一个路径,在日志会存入路径下spring.log文件中,文件名不可更改
logging.file.name: 需要写路径加文件名,注意:不能和 logging.file.path一起使用,一起使用也只有logging.file.name会生效!
logging.file.max-size: 限制日志文件大小,日志文件在达到规定大小时进行切割,产生一个新的日志文件
logging.file.max-history: 限制日志保留天数,到期自动删除
Lombok中的@Slf4j
如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@slf4j,需要安装Lombok插件和添加lombok依赖,初始化SpringBoot项目时可以选择lombok选项,这里使用@Slf4j注解后不用手动去获取Logger实例,相当于Lombok帮你实现了。但是Lombok这个插件对代码有入侵性,个人不太喜欢,下载下来也只是为了能用别人的源码而已
应用实例
第一步,创建一个SpringBoot的Web项目(略)
第二步,编写配置文件与代码
application.properties
# 日志相关配置
logging.level.root=INFO
logging.level.org.springframework.web=DEBUG
#logging.file.path=src//main//resources//log// 不能与下同用,会被覆盖
logging.file.name=src//main//resources//log//SpringBoot.log
logging.file.max-size=20MB
logging.file.max-history=7
1
2
3
4
5
6
7
在项目包中新建包controller,而后新建类HelloWordController.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class HelloWordController {
private Logger logger = LoggerFactory.getLogger(HelloWordController.class);
@RequestMapping("/world")
public @ResponseBody
String HelloWorld() {
//模拟产生日志信息
logger.debug("This is debug!");
logger.info("This is info!");
logger.warn("This is warn!");
logger.error("This is error!");
return "Hello World!";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
而后启动SpringBoot项目,访问 http://localhost:8080/hello/world
出现以上界面,说明访问成功,接下来我们看下我们的日志,注意:需要先关闭SpringBoot项目才能看到日志内容
以上就是我的日志内容了,至此,SpringBoot整合Slf4j步骤就完成了,如果需要更复杂的配置,则要写logback.xml文件,配置参数多查官方文档就好
————————————————
版权声明:本文为CSDN博主「小夏陌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22136439/article/details/104357451