咱们说了springboot做日志管理的依赖原理,用logback的方式进行实现,那怎么用呢
大家测试一下,我们打开之前创建的工程,现在不做任何配置的情况下,我就直接来运行这段代码,我们看到控制台其实
已经有日志输出了,所以我们说,springboot默认已经帮我们配置好日志了,我们直接使用就行了,那怎么用呢,我就用测试类,
如果我们想要记录一些东西,别用system.out了,system.out太简陋了,我们来用日志,日志我们首先是面对slf4j编程的,
有一个LoggerFactory,它是slf4j旗下的,有一个方法getLogger,Logger就是记录器,他要传一个class,那我就直接getClass,
把这个类的class传过去,
Logger logger = LoggerFactory.getLogger(getClass());
会给我们返回一个Logger,称之为记录器,我们就拿这个记录器记录日志,怎么记录呢,一个叫logger.trace,trace叫做跟踪
轨迹的意思,如果框架在运行过程中,跟踪一些信息,比用system.out了,然后还有一个logger.debug,debug这是调试,输出一些
调试信息,还有一个常用的是logger.info,这就是我们自己定义的一些信息,还有一个logger.warn,这相当于是警告,比如返回值
如果不是预期的,日志记录一下,还有logger.error,这是错误,如果你try catch要捕获异常,而它也出这个异常了,咱们的这个日志
记录一下,这是我们常用的这几个东西,而我们这些东西,叫日志的级别,日志级别由低到高,就是我们这几个
trace<debug<info<warn<error
我们要日志级别有什么用,这个日志框架的一大好处,可以调整日志输出的级别,比如我们的这个项目上线了,debug信息和info信息
我不想要,我只想要警告和错误,我们只想让她打印警告和错误,如果是以前我们要把它注掉,我们可以调整日志级别,
他只会打印这个级别及以后的内容,日志就只会在这个级别及以后的高级别生效,比如我们来举一个例子,
我们记录了一些信息,我们发现只输出了info,warn,error,
相当于trace和debug没有输出,springboot默认给我们默认的是info级别的,所以只会输出info级别及以后的内容,我们springboot,
也就是我这个类在输出的时候呢,我只能输出这几个级别,那我能不能调整啊,也可以调整,怎么调整呢,所有的日志调整,我们都在
配置文件里面,我们可以写一个logging
package com.learn.springboot;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
import com.learn.bean.Person;
/**
* SpringBoot单元测试
*
* 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigurationTests {
@Autowired
Person person;
@Autowired
ApplicationContext ioc;
@Test
public void testHelloService() {
boolean b = ioc.containsBean("helloService02");
System.out.println(b);
}
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
// System.out.println(person);
// 日志的级别
// 由低到高 trace<debug<info<warn<error
// 可以调整输出的日志级别;日志就只会在这个级别以后的高级别生效
logger.trace("这是trace日志......");
logger.debug("这是debug日志......");
// SpringBoot默认给我们使用的是info级别的
logger.info("这是info日志........");
logger.warn("这是warn日志........");
logger.error("这是error日志......");
}
}
有一个level叫级别,level它是一个map,他写的就是你每一个包,或者你每一个类,你日志输出用什么级别,比如我们
只调com.learn,把com.learn,learn类里面的级别我都调成trace级别
logging.level.com.learn=trace
我调成这个级别,trace以后就都能够输出了,是不是这样呢,其实没调还是给默认的info,我们这些就输出全了
#debug=true
#server.port=8081
#server.context-path=/boot02
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.level.com.learn=trace
没有制定级别的,就是用SpringBoot默认规定的级别,如果是知道这个日志框架,这就叫root级别的,把root规定成了info,
然后设置了的用我们的,没设置的,用root,然后这是我们这几个级别,以后我们开发就用它来做日志记录,通过都可以在
application里面看到,我们还有一个logging.path,和logging.file,logging.path和logging.file如果都不指定的情况下,
我们日志只会在控制台输出,如果我们用logging.file指定了日志的文件名,把日志输出到指定的文件
我们先不写logging.path看一下,我来指定一个文件名,我们就叫springboot.log
logging.file=springboot.log
我来运行一下,我们来看这个日志,日志在这有记录,没问题,当前项目下就有springboot.log,当前项目下生成
springboot.log日志,我不想在当前项目下,那我能不能在哪个盘指定呢,蔽日我要他在d盘,
logging.file=D:/springboot.log
现在我们启动起来,在d盘看一下,这儿也有,也指定上路径,不指定路径在当前项目下生成,我们可以指定完整的路径,
就在我们指定的路径下,生成我们这个文件,这是logging.file,还有一个呢,叫logging.path,这path一听就是路径,
这指定路径还有什么用呢,logging.file和logging.path其实是冲突设置,你指定logging.file不指定logging.path,
file起作用了,如果你指定了logging.file和logging.path,还是logging.file起作用,我们一般是来指定logging.path,
path是我们来指定目录,我要指定一个你要生成的日志目录,日志文件用springboot默认的,比如我们指定一个目录叫
logging.path=/spring/log
这是什么意思啊,/在linux下是绝对路径,在当前磁盘的根路径,创建spring文件夹,和里面的log文件夹,然后使用日志文件
叫什么,使用spring.log作为默认文件,这是spring规定的,所以我来试一下,然后日志帮我们记录下来,所以我们在这可以指定路径,
当然也可以指定更多的东西,如有一个logging.parttern.console,这console就是我们在控制台,在控制台输出的日志格式,那么
还有一个你能指定,logging.pattern.file,指定文件中日志输出的格式,我们默认这个格式是什么样的呢,这一块我们叫做时间,
日志级别
logging.parttern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
控制台%d就是日期,现在还是带上时分秒的,我现在不要时分秒了,然后加上线程号,加上我们这个级别,-5就是靠左对齐,logger就是
全类名50个字符,然后带上消息,%n换行,这是在控制台输出的,如果是在文件里面呢
logging.pattern.file=%d{yyyy-MM-dd} ==== [%thread] %-5level ==== %logger{50} ==== %msg%n
多给他中间加上==号,每一个每一个之间加上等等号,%thread就是我们的线程,线程用中括号括起来,我们看一下是不是按照
我们指定的格式走了呢,然后控制台输出的时候就没有时分秒了,然后我们来看我们的文件,我们现在就回按照我们规定的格式来了,
这也是我们也能规定格式,那么格式代表是什么意思
#debug=true
#server.port=8081
#server.context-path=/boot02
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.level.com.learn=trace
#logging.file=D:/springboot.log
logging.file=springboot.log
#logging.path=/spring/log
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd} ==== [%thread] %-5level ==== %logger{50} ==== %msg%n