前言
项目开发中日志是比不可少的一块,通过日志能够定位和分析事故原因。目前流行日志框架包含了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替换为其他日志实现即可。
日志使用和打印在项目中是非常重用的一部分,通过日志我们能够分析和定位问题的原因,通过日志分析我们能够清楚的知道用户的相关操作行为。
















