拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 SpringBoot中Log日志的集成详解

SpringBoot中Log日志的集成详解

白鹭 - 2022-03-07 2148 0 0

SpringBoot中Log日志的集成

一、日志的分类

1、名字分类

  • log4j :log for java (因为for和4读音差不多,所以交log4j)
  • logBack 日志说明

注意:springBoot默认集成了logback日志

2、日志分类

根日志:全域日志 rootLogger( springboot的日志级别:info)

子日志:包日志 logger

3、日志级别

OFF=》ERROR=》 WARNING=》INFOspringboot默认)=》DEBUGmybatis默认级别)=》ALL级别越高输出信息越少

日志级别由低到高: 日志级别越高输出的日志信息越少

日志级别使用场景
DEBUGdebug级别用来记录详细的信息,方便定位问题进行除错,在生产环境我们一般不开启DEBUG
INFO用来记录关键代码点的信息,以便代码是否按照我们预期的执行,生产环境通常会设定INFO级别
WARNING记录某些不预期发生的情况,如磁盘不足
ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息

二、logback简介

日志分为两类

一种是rootLogger : 用来监听项目中所有的运行日志 包括引入依赖jar中的日志

一种是logger : 用来监听项目中指定包中的日志信息

2、 java项目中使用

(1) logback组态档

logback的组态档必须放在项目根目录中 且名字必须为logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--定义项目中日志输出位置-->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--定义项目的日志输出格式-->
        <!--定义项目的日志输出格式-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern> [%p] %d{yyyy-MM-dd HH:mm:ss} %m %n</pattern>
        </layout>
    </appender>

    <!--项目中跟日志控制-->
    <root level="INFO">
        <appender-ref ref="stdout"/>
    </root>
    <!--项目中指定包日志控制-->
    <logger name="com.baizhi.dao" level="DEBUG"/>

</configuration>

(2)具体类中使用日志

@Controller
@RequestMapping("user")
public class UserController {
    private Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
    @RequestMapping("findAll")
    public String findAll(String name) {
        logger.debug("debug接收的姓名是: "+name);
        logger.info("info接收的姓名是: "+name);
        logger.warn("warn接收的姓名是: "+name);
        logger.error("error接收的姓名是: "+name);
        return "index";
    }
}

(3)使用默认日志配置

logging:
  level:
    root: debug
    com.baizhi.dao: debug
  path: /Users/whj/aa.log
  file: bbb.log

三、SpringBoot中日志使用

1、将Springboot的日志默认级别改为debug


#开启日志 如果级别:off(少)>error>warn>info>debug(多)>all
logging:
  level:
    root: debug
    com.tjcu.controller: debug
    com.tjcu.dao: debug

  • 注意:因为springboot如果使用debug作为日志打印的东西太多了,所以改用info为默认日志级别,但是mybatis等使用的是debug作为默认日志级别,所以我们需要兼顾他的日志隔离级别

2、SpringBoot项目启动就会有一个默认的日志物件:logger

  • 先配置 com.tjcu.controller: debug
#开启日志 
logging:
  level:
    root: debug
    com.tjcu.controller: debug

  • controller里面使用日志物件
@Controller
@CrossOrigin
@ResponseBody
public class EmpController {
    //在控制层定义日志物件
    private static final Logger log = LoggerFactory.getLogger(EmpController.class);
    @Autowired
    private EmpService empService;

    @RequestMapping("/emp/queryAll")
    public  List<Emp> queryall(){
        List<Emp> emps = empService.showEmp();
        for (Emp emp : emps) {
            log.debug(String.valueOf(emp));
        }
        return emps;
    }

在这里插入图片描述

  • 前端访问后
http://localhost:8080/ems/emp/queryAll

  • 控制台结果

四、idea中使用日志插件简化开发

1、下载Log Support2插件

2、重启idea

3、Settings里面会新增一个Log Support目录

FrameWork框架选择slf4j

  • 我们为什么要使用slf4j
我们自己的系统中使用了logback这个日志系统
我们的系统使用了A.jar,A.jar中使用的日志系统为log4j
我们的系统又使用了B.jar,B.jar中使用的日志系统为slf4j-simple

这样,我们的系统就不得不同时支持并维护logback、log4j、slf4j-simple三种日志框架,非常不便,

slf4j只是一个日志标准,并不是日志系统的具体实作 ,理解这句话非常重要,slf4j只做两件事情:

  • 提供日志界面
  • 提供获取具体日志物件的方法

3、如果直接使用Android的日志会冲突

4、测验

logd+enter(回车)后idea自动帮我们添加private static final Logger log1 = LoggerFactory.getLogger(EmpController.class);

其中d代表debug,i代表info,w代表warn

@Controller
@CrossOrigin
@ResponseBody
public class EmpController {
    private static final Logger log= LoggerFactory.getLogger(EmpController.class);
    @Autowired
    private EmpService empService;

    @RequestMapping("/emp/queryAll")
    public  List<Emp> queryall(){
        List<Emp> emps = empService.showEmp();
        for (Emp emp : emps) {
            log.debug("");
            log.info("");
            log.warn("");
        }
        return emps;
    }

5、使用占位的方式书写日志而不用+号拼接

{}代表占位,一个{}代表占位一个
在这里插入图片描述

@Controller
@CrossOrigin
@ResponseBody
public class EmpController {
    private static final Logger log= LoggerFactory.getLogger(EmpController.class);
    @Autowired
    private EmpService empService;

    @RequestMapping("/emp/queryAll")
    public  List<Emp> queryall(){
        List<Emp> emps = empService.showEmp();
        for (Emp emp : emps) {
            log.info("员工的信息 {} {}",emp,"这是占位");
        }
        return emps;
    }

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *