前言

   项目开发中日志是比不可少的一块,通过日志能够定位和分析事故原因。目前流行日志框架包含了log4j、log4j2、logback等,另外 slf4j(Simple Logging Facade for Java则是一个日志门面框架,提供了日志系统中常用的接口,logback 和 log4j 则对slf4j 进行了实现。本文将讲述spring boot 中如何使用logback+slf4j实现日志。

简单使用

1.maven中添加spring-boot-starter-logging引用

<<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

实际开发中无需添加此依赖,spring Boot 默认的日志框架 Logback+SLF4J且spring-boot-strater默认而 添加了此依赖,而spring-boot-starter-web 包含了spring-boot-starter,所以开发中只需要引入spring-boot-starter-web组件即可.

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.默认配置

默认情况下Spring Boot将日志输出到控制台,不会写到日志文件。如果需要写入日志文件,则需在application.yml中设置logging.file属性

logging:
  level:
    com.sfw: debug
    org.springframework.jdbc.core.JdbcTemplate: debug
  file:
    name: /log/log-core.log

说明:name:日志文件的路径,level:日志级别。

3.日志使用

  阿里编码规范中明确说明:应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

  具体实现如下:

  1. 编写日志门面类

public class Log
{
    private Logger logger;

    public Log(Logger logger)
    {
        this.logger = logger;
    }

    public boolean isDebugEnabled()
    {
        return logger.isDebugEnabled();
    }

    public void debug(String message)
    {
        this.logger.debug(message);
    }

    public void debug(String message, Object... params)
    {
        this.logger.debug(message, params);
    }

    public void debug(String message, Throwable t)
    {
        this.logger.debug(message, t);
    }

    public void info(String message)
    {
        (message);
    }

    public void info(String message, Object... params)
    {
        (message, params);
    }
    
    public void warn(String message, Object... params)
    {
        this.logger.warn(message, params);
    }

    public void info(String message, Throwable t)
    {
        (message, t);
    }

    public void error(Throwable t)
    {
        this.logger.error(null, t);
    }

    public void error(String message)
    {
        this.logger.error(message);
    }

    public void error(String message, Object... params)
    {
        this.logger.error(message, params);
    }

    public void error(String message, Throwable t)
    {
        this.logger.error(message, t);
    }
}

2.日志工厂类,通过工厂获取日志实例

public class LogManager
{
    public static Log getLogger(Class<?> clazz)
    {
        Logger logger = LoggerFactory.getLogger(clazz);
        return new Log(logger);
    }
    
    public static Log getLogger(String name)
    {
        Logger logger = LoggerFactory.getLogger(name);
        return new Log(logger);
    }
}

 3.具体使用

public static Log logger = LogManager.getLogger(ExceptionHandler.class);

logger.inf0("this is info logger"); //记录info级别日志
logger.debug("this is info logger");//记录debug级别日志
logger.error("this is info logger");//记录error级别日志

String str="ac";
logger.error("this is info logger param [{}]",str);//通过占位符输出变量

附加内容

可能很多人对这种写法会有疑虑,直接在类中使用API调用不更简单吗?

   相信大家都知道,前段时间因为log4j爆发的漏洞,导致了很多员工都通宵加班紧急修复此问题,  如果直接采用Api方式编写日志,那么修改此问题工作量非常巨大。采用门面日志的方式,子需要在工厂类中将日志的实现由log4j替换为其他日志实现即可。

日志使用和打印在项目中是非常重用的一部分,通过日志我们能够分析和定位问题的原因,通过日志分析我们能够清楚的知道用户的相关操作行为。