我是一名程序员,我喜欢写System.out.println来打印一些重要的信息...后来我学了面向对象,我把这些输出语句整合到了一个工具类里面,可以打印,也可以保存日志。

  我是一名积极思考的程序员,我经常迭代我的工具类jar包,这样项目引用的时候需要修改一些东西,比如我最开始是工具类1.0版本.jar,后来我升级到了工具类2.0版本.jar.....

  项目引用的API啥的需要修改,每次都修改烦不烦?

  我是一名实力不断提升的程序员,我设计了一个日志工具的接口,只要实现我这个接口,不管你什么工具类版本多少,符合接口规范都OK。

  日志框架出现了,分为两种:

  1.日志门面:相当于军队的谋士,我只负责充门面,出谋划策,水攻火攻空城计,但是我不做,你找人去做

  2.日志实现:相当于军队的士兵,我不管啥计策水啊火啊东风啊,我只需要你告诉我,我去干,我去放火,放水,借诸葛亮...

  现在的日志框架门面和实现大概有以下几种:

  1.日志门面:SLF4j , JCL ,jboss-logging

  2.日志实现:Logback , log4j ,JUL ,log4j2

  红色部分是同一个人做的,而且是比较优秀的,所以我们就采用这个人做的,门面用SLF4j,实现有俩,因为Logback是因为log4j某些性能问题而新写的一个实现,所以我们使用logback

  Spring默认使用的是JCL

  而我们的Spring Boot采用的是SLF4j和Logback,还不错。

  我们现在已经确定了,我们日志门面和实现就是使用这俩了,但是我们在工作中啊,那些项目里面的Spring,Mybaties啥的,他们都有各自的日志门面啊,都不是SLF4j,这样的话我还是要去熟悉他们的日志门面,这不智障吗?

  恩,这个严峻的问题已经被解决了,比如项目里面使用的是JCL,有一个jar包是JCL-over-SLF4j ,就是还是JCL里面的方法,但是实现调用的是SLF4J,真是不错啊。

 

  Spring Boot会自动的把所有的其它日志框架给偷梁换柱到SLF4j,所以我们再引入其它的工具,例如Mybaties啥的,只需要把他们的日志框架给排除掉就行,剩下的,Spring Boot已经全部帮你做好了。

  接下来,尝试着打印一下日志,我在测试类里这样写

    @Test
public void contextLoads() {
// System.out.println(person); //日志的级别,一下级别从低到高排序 trace<debug<info<warn<error
//spring boot默认的日志级别是info,所以只会输出info及以后的级别,当然,可以自定义开始的级别
Logger logger=LoggerFactory.getLogger(getClass());
logger.trace("这是跟踪日志");
logger.debug("这是调试日志");
logger.info("这是自定义信息日志");
logger.warn("这是警告日志");
logger.error("这是错误信息日志");
}

我们新建一个测试类,叫LoggerTest,新建了这个类之后,他就是一个普通的类,需要加上以下注解才能变成测试类

@RunWith(SpringRunner.class)
@SpringBootTest

在这里说一下创建日志对象的语句

public class LoggerTest {
   @Test
   public void test(){
       Logger logger=LoggerFactory.getLogger(LoggerTest.class);
       String name="许嵩";
       String password="514Vae";
       log.info("name={},password={}",name,password);
  }
}

这里的getLogger要写当前类.class,这是因为输出的时候,输出信息前面会带上这个类名,这样我们就知道错误信息是哪个类里面的了,如果不加,谁知道这个错误信息在哪个类里面,所以要写,但是也可以不写,可以通过注解来完成,这样

package com.vae.springboot.study;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
   @Test
   public void test(){
       String name="许嵩";
       String password="514Vae";
       log.info("name={},password={}",name,password);
        log.error("我是error");
    }
}

使用@Slf4j注解就相当于创建日志对象了,很方便,不过这个注解是lombok里面的,去maven里面下一个这个插件就好了,直接使用log进行日志记载,也可以输出变量,如上面的代码,使用{}来作为占位符

现在问题来了,我的日志系统只能输出文本和变量啥的,和我的System.out.println没啥区别啊,别急,日志系统的配置来了,有两种配置方式

  1. application.properties(或者yml):简单配置方式,配个输出格式,路径啥的

  2. logback-spring.xml:专业版配置方式,能配置的东西很多,开发时就用这个

我现在先提出两个问题,然后我们再去讲解上面的两种配置方式,看看哪种能解决问题

问题1:日志有info和error日志,我希望这两种日志区分开,存到不一样的地方,好找

问题2:我希望每天生产一个日志文件

带着这两个问题,我们来讲解一下日志的配置

application.yml和application.properties配置

这俩都一样,我比较喜欢yml,但是这里我都写出来,你们随意选一个

application.yml方式

logging:
pattern:
  console: "%d{yyyy-MM-dd} - %msg%n" #这个只对控制台有影响,%d是时间,{yyyy-MM-dd}是格式,%msg是输出的信息,%n是换行
path: D:/    #在D盘下创建日志,默认是spring.log,而且这个不受console的影响
file: D:/loginfo.log  #这个file和path其实差不多,唯一的区别在于file可以指定日志的名称,path默认就是spring.log改不了
level: com.vae.springboot.study=trace  #这个是说study包下的代码,都是以trace为开始的

application.properties方式

#设定日志的级别,我们com.vae这个包下面都是
logging.level.com.vae=trace

#默认是在控制台输出的,我们可以设定输出为一个文件,只写springboot.log就是在项目里面生成,我加了个D:/,就会在D盘生成
logging.file=D:/springboot.log
#这个和上面的意思是一样的,只不过这个是在当前文件的当前盘下面新建了一个spring文件夹下的log
logging.path=/spring/log
#设置输出格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n

很明显,这种配置顶多就是改个输出的格式,路径,我们的两个问题貌似一个都不能解决,下面来看看专业的配置

logback-spring.xml配置

在resources文件夹下面,新建一个文件,叫logback-spring.xml,内容如下

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--加一个过滤器,info日志只输出info信息-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>D:/info.%d.log</fileNamePattern>
</rollingPolicy>
</appender> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--加一个过滤器,error日志只输出error信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>error</level>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>D:/error.%d.log</fileNamePattern>
</rollingPolicy>
</appender> <root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root> </configuration>

解释一下这个xml文件

appender里面就是写的各种方式的格式,可以看到我这里写了三个,
一个是consoleLog,这个是输出控制台的
一个是fileInfoLog,这个是输出info文件的,因为info等级上面还有warn和error,如果不过滤的话,这三个都会输出出来,所以我写了一个过滤的
filter,class是LevelFilter,是info就ACCEPT,其他的都不要,这样info文本里面就只有info信息了
一个是fileErrorLog,这个是输出error信息的,我也加了个过滤器,filter,class是ThresholdFilter,这个的意思是只输出error以上等级的信息,error是最高级别的,所以只会输出error信息

滚动策略里面就是保持文本的路径

最后我们写完appender之后,要在root里面添加一下,然后就完事了。

logback-spring.xml完美的解决了我们的两个问题,很好,看看结果图吧

Spring Boot笔记四:日志框架介绍的更多相关文章

  1. Spring Boot笔记六:Thymeleaf介绍

    目录 什么是thymeleaf? 创建最简单的thymeleaf thymeleaf语法 什么是thymeleaf? thymeleaf是一个模板引擎,是用来在Spring Boot中代替JSP的 引 ...

  2. Spring Boot笔记(四) springboot 集成 @Scheduled 定时任务

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.在SpringBoot 项目中使用@Scheduled注解执行定时任务: 配置pom.xml 依赖: ...

  3. Spring Boot第四弹,一文教你如何无感知切换日志框架?

    持续原创输出,点击上方蓝字关注我吧 目录 前言 Spring Boot 版本 什么是日志门面? 如何做到无感知切换? 如何切换? 引入依赖 指定配置文件 日志如何配置? 总结 前言 首先要感谢一下读者 ...

  4. Spring Boot 笔记 (2) - 使用 log4j2 记日志

    日志框架的选用 Spring 使用的默认日志框架是 logback, 默认情况下会采取默认的 autoconfiguration; 即便想对日志的一些配置进行修改也比较方便, 详细可以参考: Spri ...

  5. 【SpringBoot】Logback日志框架介绍和SpringBoot整合实战

    ========================11.Logback日志框架介绍和SpringBoot整合实战 2节课================================ 1.新日志框架L ...

  6. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理

    Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...

  7. spring boot 笔记--第三章

    spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...

  8. Spring Boot 系列:日志动态配置详解

    世界上最快的捷径,就是脚踏实地,本文已收录架构技术专栏关注这个喜欢分享的地方. 开源项目: 分布式监控(Gitee GVP最有价值开源项目 ):https://gitee.com/sanjianket ...

  9. Spring Boot Logback应用日志

    e Spring Boot Logback应用日志 2015-09-08 19:57 7673人阅读 评论(0) 收藏 举报 . 分类: Spring Boot(51) . 目录(?)[+] 日志对于 ...

随机推荐

  1. Go中的Init函数

    init函数会在main函数执行之前进行执行.init用在设置包.初始化变量或者其他要在程序运行前优先完成的引导工作. 举例:在进行数据库注册驱动的时候. 这里有init函数 package post ...

  2. oracle的用户账号密码设置

    1. 可以用sqlplus system/你输入的密码 可以用sqlplus /nolog 可以用sqlplus /as sysdba2. @你scott.sql的路径3. 修改你的账号 alter ...

  3. Spring04-SpringEL&Spring JDBC数据访问

    一. SpringEL入门 Spring动态语言(简称SpEL) 是一个支持运行时查询和操作对象图的强大的动态语言,语法类似于EL表达式,具有诸如显示方法和基本字符串模板函数等特性. 1. 准备工作 ...

  4. 【XSY1162】鬼计之夜 最短路

    题目描述 给你一个\(n\)个点\(m\)条边的有向图,有\(k\)个关键点.求一条最短的从一个关键点到另一个关键点的路径. \(n,m,k\leq 100000\) 题解 跑\(k^2\)次最短路显 ...

  5. 如何使用JPQL写纯SQL语句

    使用JPQL,需要把SQL语句修改成类似HQL 语句.SQL 查询的是数据库,而JPQL 查询的是对象和属性,在语法上是有些不同的.对于有些用JPQL 无法写出来的查询,还是使用原生SQL写出来方便 ...

  6. Git初始化及配置

    >>>>Git简介 >>>>官网下载Git >>>>安装,一路next 安装成功后,鼠标右键里就有Git bash here和G ...

  7. Python35安装

    wnm系列之python安装 下载网址https://www.python.org/downloads/ 之前就用的3.5.4版本,这次还下这个 安装,我直接选择的install now 默认位置安装 ...

  8. linux环境node服务器配置流程

    一. 安装node Node 官网已经把 linux 下载版本更改为已编译好的版本了,我们可以直接下载解压后使用: # wget https://nodejs.org/dist/v10.9.0/nod ...

  9. HNOI2019 游记

    HNOI2019 游记 Day 0 其实考前几天,心里还是挺慌的.结果最后 Day 0 的时候,因为种种原因反而释然了.也许是觉得,在这一步退役,也没有什么好害怕的吧. OI 本身就是一项偶然性太大的 ...

  10. HNOI2017 抛硬币 (FakeBeng)

    除了队长快跑外最难的题吧. 除了需要写\(exLucas\)之外,还教会了我大量的卡常技巧. 首先\(70\)分就是个直接按题意模拟,易得\(ans=\sum_{j=0}^{b} C_{b}^{j}\ ...