1.首先了解一下日志的等级:基本我们实际工作中所用到的就是以下五种级别:
40 Error
30 Warn
20 Infor
10 Debug
0 Trace
等级越高 说明他的对程序影响的程度越高 logback的默认级别为Infor 级别 所以默认输出的级别为 比Infor级别等级高 日志才能输出出来 然而 比Infro级别低的 像Debug Trace 默认情况下 就不会输出出来的。
2.然后:简单配置--编写代码的方式和标签配置的方式
编写代码的方式:
@RunWith(SpringRunner.class) @SpringBootTest public class HappymallApplicationTests { private final Logger logger= LoggerFactory.getLogger(HappymallApplicationTests.class); @Test public void contextLoads() { logger.error("Error....."); logger.info("Info......");//默认只输出infor和error级别的log日志信息 logger.debug("Debug......"); } }
标签配置的方式:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
import lombok.extern.slf4j.Slf4j;
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j//这个出自于lombok中的Slf4j public class HappymallApplicationTests { @Test public void contextLoads() { log.error("Error....."); log.info("Info......");//默认只输出infor和error级别的log日志信息 log.debug("Debug......"); } }
3.然后在日志输出变量
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class HappymallApplicationTests { @Test public void contextLoads() { String name="zhangsan"; String password="123456"; log.error("Error....."); log.info("Info......"); log.info("name:{},password:{}",name,password); //name:zhangsan,password:123456 log.debug("Debug......"); } }
4. 日志的配置
有两种方式 :
第一种方式是在spring主要的配置文件中:只能进行简单的配置日志的输出格式 打印在控制台中
2019-06-23 13:01:54.433 ERROR 1179 --- [ main] c.s.happymall.HappymallApplicationTests : Error.....
2019-06-23 13:01:54.433 INFO 1179 --- [ main] c.s.happymall.HappymallApplicationTests : Info......
2019-06-23 13:01:54.433 INFO 1179 --- [ main] c.s.happymall.HappymallApplicationTests : name:zhangsan,password:123456
1.在spring主要的配置文件中 添加:logging.pattern.console=%d - %msg%n 控制台输出
2019-06-23 13:15:46,074 - Error.....
2019-06-23 13:15:46,074 - Info......
2019-06-23 13:15:46,074 - name:zhangsan,password:123456
相比之前没有配置之前 日志的输出的信息明显少了很多。
2.在spring主要的配置文件中再添加:logging.path=/Atomatic/java/happymall/src/main/resources/logs运行之后 会在这个路径下 默认形成一个spring.log文件 记录的就是当前运行时控制台打印的内容,路径下的日志文件可以更改成其他的名字文件 例如:xxx.log.
3.logback的输出的日志默认为infor 可以更改为其他的日志级别:logging.level=debug,这样日志输出级别就给成了debug了。
还可以单独指定某个类的日志输出级别:logging.level.com.spring.loggerTest=debug.
第二种方式是在logback-spring.xml:可以进行自定义配置日志的输出方式 以不同的日志级别 分别输出不同的日志文件
现在有这样的需求:
区分infor和error的日志
每天生成一个日志文件(分别存储在指定的路径下)
就可以使用第二种方式进行配置 实现这两个需求(注意 为了使用第二种方式配置日志 请先注释掉第一种日志的配置内容)
使用logback-spring.xml文件的方式进行配置
1.<!--这个是一个简单的配置 日志的输出地方为控制台--> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <!-- 1.layout顾名思义就是日志的展示形式--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> %d - %msg%n </pattern> </layout> </appender>
<!--以上的简单的配置完成之后 要用到哪呢?添加一个root节点,定义日志的输出级别为infor,配置的是整个项目都适用-->
<root level="info"> <appender-ref ref="consoleLog"/>//把配置好的日志输出格式和输出地方加入进来,让consoleLog配置生效。 </root>
以上整体的日志配置 主要分为两个部分 你个是配置日志输出的格式和输出到什么地方
2.控制台进行输出日志配置如上,那日志文件的方式输出怎么配置呢?接着往下看:
在创建一个appender
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder><!--之前控制台中叫layout,这里使用encoder--> <pattern> %msg%n </pattern> </encoder> <!--滚动策略:根据我们的需求进行生成日志文件,滚动的模式是按照时间来滚动:TimeBasedRollingPolicy,我们的需求就是每天生成一个日志文件--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路径:日志文件的存放路径--> <fileNamePattern>/Atomatic/java/happymall/src/main/resources/logs/%d/info.%d.log</fileNamePattern> </rollingPolicy> </appender>
<root level="info">
<appender-ref ref="consoleLog"/>//1
<appender-ref ref="fileInfoLog"/>//2把配置好的日志输出格式和输出地方加入进来,让fileInfoLog配置生效。
</root>
以上两种配置完成之后 运行程序,就会在/Atomatic/java/happymall/src/main/resources/logs目录下,程序会自动创建一个以当前时间为文件夹并在这个文件夹中生成一个日志文件info.2019.6.23.log的文件,并把当前控制台打印出来的信息 存储在日志文件中。
3.在日志文件info.2019.6.23.log中 我们发现 所有的infor级别和error级别的信息都别保存在一个文件中了 那么 我们该如何按级别生成不同的日志文件呢?
接下来 我们要进行过滤 把我们想要的信息 给过滤出来 ,这里我们新加入一个标签 <filter/>, 进行筛选
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level> //根据日志级别进行筛选ERROR级别的日志--每天生成一个日志文件(ERROR是最高级别的日志信息)
</filter>
但是如果你在level中进行筛选infor级别的日志,那么他会输出info和比infor还高级别的日志信息
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level> //根据日志级别进行筛选INFO级别的日志--每天生成一个日志文件,结果他会输出info和比infor还高级别的日志信息
</filter>
4.那怎么办呢?我们使用LevelFilter 进行筛选
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level>//直接筛选ERROR级别的日志 <onMatch>DENY</onMatch>//如果命中 进行进行禁止。 <onMismatch>ACCEPT</onMismatch>//没有命中,进行接受 接受的也就是我们想要的infor级别的日志信息 </filter>
因为在logback 中有这么个枚举类
public enum FilterReply(){
DENY,NEUTRAL,ACCEPT;//分别代表禁止 中立 接受
}