Java基础知识——日志

简介

在编写程序的过程中,发现程序运行结果与预期不符,这时怎么办呢?以前的做法是用System.out.println()调试,可是调好以后还要删了,出错了又要重写,如此反复很麻烦,但现在有更好的解决方法,那就是使用日志

日志的优点
  • 可以设置输出样式,避免每次都写"ERROR: " + var;
  • 可以设置输出级别,禁止某些级别输出。例如,只输出错误日志;
  • 可以被重定向到文件,这样可以在程序运行结束后查看日志并追踪问题;
  • 可以根据配置文件调整日志,无需修改代码
  • 可以按包名控制日志级别,只输出某些包打的日志;

日志工具

java.util.logging

这是Java标准库内置的日志包,共有七个日志级别(从严重到普通):SEVEREWARNINGINFOCONFIGFINEFINERFINEST
默认级别是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.");
    }
}
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。共六个日志级别:FATALERRORWARNINGINFODEBUGTRACE,默认级别也是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.");
    }
}
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名:通常使用源代码的类名
日志内容:我们输出的消息

日志输出方式

  • 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

在项目包中新建包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!";
    }
}

而后启动SpringBoot项目,访问 http://localhost:8080/hello/world
在这里插入图片描述
出现以上界面,说明访问成功,接下来我们看下我们的日志,注意:需要先关闭SpringBoot项目才能看到日志内容
在这里插入图片描述
以上就是我的日志内容了,至此,SpringBoot整合Slf4j步骤就完成了,如果需要更复杂的配置,则要写logback.xml文件,配置参数多查官方文档就好

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小夏陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值