spring boot 整合log4j并输出日志文件

第一步: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"/>
         &lt;!&ndash; 这个配置使全局的映射器启用或禁用缓存  &ndash;&gt;
         <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/

配置完成后运行项目结果如下,到此便整合完成

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值