第一步:spring boot默认的日志框架是logback,首先去除Logback的jar包,并引入Log4j2的jar。我在网上找到一些资料说排除spring-boot-starter或者spring-boot-starter-web下的日志框架即可,我建议两个都排除。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--排除spring boot自带的日志框架-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--排除spring boot自带的日志框架-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入log4j依赖包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
第二步:创建ColoredPatternLayout类,若log4.properties文件中没有使用则不需要创建
import org.apache.log4j.Level;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;
import java.util.StringTokenizer;
/**
* 描述: 颜色
*
* @outhor Administrator
* @create 2018-11-07 17:45
*/
public class ColoredPatternLayout extends PatternLayout {
private static final String CONFIGURATION_SEPARATOR="/";
private static final String PREFIX = "\u001b[";
private static final String SUFFIX = "m";
private static final char SEPARATOR = ';';
private static final String END_COLOR = PREFIX + SUFFIX;
private static final String ATTR_NORMAL = "0";
private static final String ATTR_BRIGHT = "1";
private static final String ATTR_DIM = "2";
private static final String ATTR_UNDERLINE = "3";
private static final String ATTR_BLINK = "5";
private static final String ATTR_REVERSE = "7";
private static final String ATTR_HIDDEN = "8";
private static final String FG_BLACK = "30";
private static final String FG_RED = "31";
private static final String FG_GREEN = "32";
private static final String FG_YELLOW = "33";
private static final String FG_BLUE = "34";
private static final String FG_MAGENTA = "35";
private static final String FG_CYAN = "36";
private static final String FG_WHITE = "37";
private static final String BG_BLACK = "40";
private static final String BG_RED = "41";
private static final String BG_GREEN = "42";
private static final String BG_YELLOW = "44";
private static final String BG_BLUE = "44";
private static final String BG_MAGENTA = "45";
private static final String BG_CYAN = "46";
private static final String BG_WHITE = "47";
private String fatalErrorColor
= PREFIX + ATTR_DIM + SEPARATOR + FG_RED + SUFFIX;
private String errorColor
= PREFIX + ATTR_DIM + SEPARATOR + FG_RED + SUFFIX;
private String warnColor
= PREFIX + ATTR_DIM + SEPARATOR + FG_MAGENTA + SUFFIX;
private String infoColor
= PREFIX + ATTR_DIM + SEPARATOR + FG_GREEN + SUFFIX;
private String debugColor
= PREFIX + ATTR_DIM + SEPARATOR + FG_WHITE + SUFFIX;
public ColoredPatternLayout(){
super();
}
public ColoredPatternLayout(String pattern){
super(pattern);
}
public String format(LoggingEvent event){
if( event.getLevel().equals(Level.FATAL)){
return fatalErrorColor+super.format(event)+END_COLOR;
}else if( event.getLevel().equals(Level.ERROR)){
return errorColor+super.format(event)+END_COLOR;
}if( event.getLevel().equals(Level.WARN)){
return warnColor+super.format(event)+END_COLOR;
}if( event.getLevel().equals(Level.INFO)){
return infoColor+super.format(event)+END_COLOR;
}if( event.getLevel().equals(Level.DEBUG)){
return debugColor+super.format(event)+END_COLOR;
}else{
throw new RuntimeException("Unsupported Level "+event.toString());
}
}
private String makeFgString(String fgColorName){
if(fgColorName.toLowerCase().equals("black")){
return FG_BLACK;
}else if(fgColorName.toLowerCase().equals("red")){
return FG_RED;
}else if(fgColorName.toLowerCase().equals("green")){
return FG_GREEN;
}else if(fgColorName.toLowerCase().equals("yellow")){
return FG_YELLOW;
}else if(fgColorName.toLowerCase().equals("blue")){
return FG_BLUE;
}else if(fgColorName.toLowerCase().equals("magenta")){
return FG_MAGENTA;
}else if(fgColorName.toLowerCase().equals("cyan")){
return FG_CYAN;
}else if(fgColorName.toLowerCase().equals("white")){
return FG_WHITE;
}
System.out.println("log4j: ColoredPatternLayout Unsupported FgColor "+fgColorName);
return "-1";
}
private String makeBgString(String bgColorName){
//System.out.println("bg "+bgColorName);
if(bgColorName.toLowerCase().equals("black")){
return BG_BLACK;
}else if(bgColorName.toLowerCase().equals("red")){
return BG_RED;
}else if(bgColorName.toLowerCase().equals("green")){
return BG_GREEN;
}else if(bgColorName.toLowerCase().equals("yellow")){
return BG_YELLOW;
}else if(bgColorName.toLowerCase().equals("blue")){
return BG_BLUE;
}else if(bgColorName.toLowerCase().equals("magenta")){
return BG_MAGENTA;
}else if(bgColorName.toLowerCase().equals("cyan")){
return BG_CYAN;
}else if(bgColorName.toLowerCase().equals("white")){
return BG_WHITE;
}
System.out.println("log4j: ColoredPatternLayout Unsupported BgColor "+bgColorName);
return "-1";
}
private String makeAttributeString(String attributeName){
//System.out.println("attribute "+attributeName);
if(attributeName.toLowerCase().equals("normal")){
return ATTR_NORMAL;
}else if(attributeName.toLowerCase().equals("bright")){
return ATTR_BRIGHT;
}else if(attributeName.toLowerCase().equals("dim")){
return ATTR_DIM;
}else if(attributeName.toLowerCase().equals("underline")){
return ATTR_UNDERLINE;
}else if(attributeName.toLowerCase().equals("blink")){
return ATTR_BLINK;
}else if(attributeName.toLowerCase().equals("reverse")){
return ATTR_REVERSE;
}else if(attributeName.toLowerCase().equals("hidden")){
return ATTR_HIDDEN;
}
System.out.println("log4j: ColoredPatternLayout Unsupported Attribute "+attributeName);
return "-1";
}
private String makeColorString(String colorName){
//System.out.println(colorName);
StringTokenizer tokenizer=new StringTokenizer(colorName,
CONFIGURATION_SEPARATOR);
String fgColor=FG_WHITE;
String bgColor=BG_BLACK;
String attr=ATTR_NORMAL;
if(!tokenizer.hasMoreTokens()){
return PREFIX + ATTR_NORMAL + SEPARATOR + FG_WHITE + SUFFIX;
}
if(tokenizer.hasMoreTokens()){
fgColor=makeFgString(tokenizer.nextToken());
}
if(tokenizer.hasMoreTokens()){
bgColor=makeBgString(tokenizer.nextToken());
}
if(tokenizer.hasMoreTokens()){
attr=makeAttributeString(tokenizer.nextToken());
}
//return PREFIX + ATTR_DIM + SEPARATOR + FG_WHITE + SUFFIX;
return PREFIX + attr
+ SEPARATOR + fgColor
+ SEPARATOR + bgColor
+SUFFIX;
}
public String getFatalErrorColor(){
return fatalErrorColor;
}
public void setFatalErrorColor(String colorName){
fatalErrorColor=makeColorString(colorName);
}
public String getErrorColor(){
return errorColor;
}
public void setErrorColor(String colorName){
//System.out.println(colorName);
errorColor=makeColorString(colorName);
}
public String getWarnColor(){
return warnColor;
}
public void setWarnColor(String colorName){
warnColor=makeColorString(colorName);
}
public String getInfoColor(){
return infoColor;
}
public void setInfoColor(String colorName){
infoColor=makeColorString(colorName);
}
public String getDebugColor(){
return debugColor;
}
public void setDebugColor(String colorName){
debugColor=makeColorString(colorName);
}
}
第三步:创建log4.properties文件
log4j.debug=true
log4j.rootLogger=INFO,console,debug,error,warn
log4j.logger.com.alibaba.druid.filter.logging.Log4j2Filter=DEBUG
#log4j.logger.com.alibaba.druid=DEBUG
#log4j.logger.com.atomikos=ERROR
log4j.appender.console=org.apache.log4j.ConsoleAppender
## console面板自定义打印颜色配置,也可以使用默认的org.apache.log4j.PatternLayout
## 配置自己的面板输出颜色类ColoredPatternLayout
log4j.appender.console.layout=*.ColoredPatternLayout
log4j.appender.console.layout.ConversionPattern=[%p-%d{HH\:mm\:ss}]%c{1}.(%L) - %m%n
log4j.appender.console.Threshold=DEBUG
## 输出到日志文件 ###
log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File = debug.log
log4j.appender.debug.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.debug.Append = true
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern = %-d{HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
## 保存异常信息到单独文件 ###
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = error.log
log4j.appender.error.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %-d{ HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
## 保存异常信息到单独文件 ###
log4j.appender.warn = org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.File = warn.log
log4j.appender.warn.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.warn.Append = true
log4j.appender.warn.Threshold = WARN
log4j.appender.warn.layout = org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern = %-d{HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
第四步:创建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 在这个文件放置一些全局性的配置
<typeAliases>
<typeAlias type="实体类" alias="别名"/>
</typeAliases> -->
<settings>
<setting name="cacheEnabled" value="false" />
<!-- 打印查询语句 -->
<!--<setting name="logImpl" value="STDOUT_LOGGING" />-->
<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
<!-- 设置缓存和延迟加载等等重要的运行时的行为方式
<setting name="defaultStatementTimeout" value="25000"/>
<!– 这个配置使全局的映射器启用或禁用缓存 –>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="useColumnLabel" value="true" />
<setting name="mapUnderscoreToCamelCase" value="true" />-->
</settings>
<!-- 以下内容不再需要手动配置 已经自动映射 -->
<!--配置sql拦截器-->
<plugins>
<plugin interceptor="shop.guangzhou.yunwuyou.config.SqlStatementInterceptor"/>
</plugins>
<!--<plugins>
<plugin interceptor="cn.chenlilin.blog.filter.SqlStatementInterceptor" />
</plugins>-->
</configuration>
第五步:添加全局异常拦截器GlobalExceptionHandler
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.tomcat.util.http.fileupload.FileUploadBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import shop.guangzhou.yunwuyou.utils.Msg;
import java.io.PrintStream;
/**
* Created by Administrator on 2020/11/13.
*/
@RestControllerAdvice
@Component
public class GlobalExceptionHandler {
static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Msg globalExceptionHandle(Exception e) {
logger.error("===========全局统一异常处理============");
logger.error(getExceptionInfo(e));
return Msg.fail(500, "error", "系统错误");
}
private static String getExceptionInfo(Exception ex) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(out);
ex.printStackTrace(printStream);
String rs = new String(out.toByteArray());
try {
printStream.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}
}
第四步:配置application.yml文件,在最下面加入如下配置即可
# MyBatis配置`
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*.xml
type-aliases-package: shop.guangzhou.yunwuyou.pojo
logging:
config: classpath:log4j.properties
path: classpath:log/
配置完成后运行项目结果如下,到此便整合完成