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。

正在写。。。
发布了59 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_22136439/article/details/104357451