1. 常用日志组件和选择

java开发日志处理是发现和调试bug所 必不可少的,那么现在企业中常用的日志组件有哪些呢,JCL 、 JUL、  SLF4j、Log4j、  Log4j2 、 Logback、 jboss-loggin 等,一般日志是配套出现的,一般是由  一个日志门面 和 一个日志实现 配套使用,
那么 组成以下结构
日志门面
日志实现
    JCL 
    log4j
  SLF4j
   log4j2
       jboss-loggin   logback
      JUL

那么,下面开始 一个个排除
JUL:实现简陋,很多地方受到开发者的吐槽,所以 首先排除

jboss-loggin:自诞生之初,就不是为了服务大众,不受到什么青睐,所以 也排除

log4j:log4j虽然声名显赫,但是在这里 首先要知道一点  slf4j 、log4j、logback 这三个框架都是同一个作者ceki 开发的,作者说 log4j 太烂,不想修改了,因此开发了 升级版的 log4j,也就是 logback ,因此在这里 我们划掉 log4j

log4j2:log4j2不是log4j的升级版,而是apache开发的,log4j2 该框架很优秀,正是因为太优秀,设计时与 部分框架对其支持的程度有限,不一定会什么时候踩坑,而log4j2在设计时的性能是优于logback的,但是 99%的开发者不会有机会体会到这种差距,因为  logback也很优秀,足够我们日常开发,所以我们划掉 log4j2

JCL:划掉JCL 主要是因为 日志实现上我们选择了 logback,而 logback和slf4j 毕竟是同一个作者写的,亲生的,合得来,而且在springboot 中 ,也是使用的  slf4j + logback,所以我们划掉了 JCL

因此,最后剩下的就是我们 这篇博客的 内容了 ,如何配置和使用  SLF4j + logback

2. 日志的使用

2.1 在这里我们新建一个springboot项目做测试
2.2 创建一个测试类,内容如下:
  1. package com.lonely;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import org.springframework.test.context.junit4.SpringRunner;
  10.  
  11. /**
  12. * Created by 15072 on 2018/1/6.
  13. */
  14. @RunWith(SpringRunner.class)
  15. @SpringBootTest
  16. public class LoggerTest {
  17.  
  18. private static Logger logger = LoggerFactory.getLogger(LoggerTest.class);
  19.  
  20. @Test
  21. public void testLogger(){
  22. logger.debug("debug:....");
  23. logger.info("info...");
  24. logger.error("error...");
  25. }
  26.  
  27. }

在这里 ,我们需要在每个类中 创建一个 Logger对象,并且使用 当前类的类名来创建,那么 这个类名存在的意义在哪里?我们可以先运行 第一个测试,看下结果



由上图可知,我们的类名在 日志中 是为了方便我们找到异常是在哪个类中,进行锁定,不信的话,我们可以在新建一个测试类, LoggerTest2,里面什么都不写, 然后将 LoggerFactory.getLogger(LoggerTest2.class); ,我们可以在测试一次,看看结果

因此,使用类名创建的logger 的作用就是在这里,但是如果我们需要在每个类中都这样的创建一个logger对象,不方便,因此可以通过 一个注解来帮我们实现 那就是  @Slf4j ,该注解就可以帮我们自动创建一个 log对象

但是 如果使用 @Slf4j 注解 需要两点,
2.添加 lombok的依赖


测试一下,编写测试方法
  1. @Test
  2. public void testSl4j(){
  3. log.debug("sl4j.debug...");
  4. log.info("sl4j.info");
  5. log.error("sl4j.error");
  6. }


这里的日志输出格式 是默认的,我们可以通过的教程 来配置 日志输出配置



3. 日志的配置

日志可以通过两种方法配置,一种是  application.yml配置,一种是  lobback-spring.xml配置

3.1 application.yml配置,这种配置方法 配置项较少,一般有以下属性配置
1. 配置输出格式 为  时间  -  消息  换行
  1. logging:
  2. pattern:
  3. console: "%d - %msg%n"


2. 配置日志输出位置 比如磁盘 e盘


  1. logging:
  2. pattern:
  3. console: "%d - %msg%n"
  4. path: e:/

运行后,我们可以看到 在 e盘下生成了一个文件  spring.log  这文件是spring生成

3. 配置日志输出文件 ,这样可以指定日志输出到哪个位置
  1. logging:
  2. pattern:
  3. console: "%d - %msg%n"
  4. path: e:/
  5. file: e:/sell.log

我们可以看到 在e盘下生成了以下文件


这里注意:我们可以配置日志保存位置,以及具体输出的文件,如果同时配置的话,会使用我们指定的file为主,可以测
试,看e盘下具体生成什么文件

4. 配置日志 输出级别
日志一般主要看重的有5个级别,优先级如 DEBUG<INFO<WARN<ERROR<FATAL等,而springboot默认配置
是 INFO级别,所以 我们测试代码中写了三行,在结果中我们只看到了 info 和 error的 因为 debug优先级比info低,所以我们
看不到。那么我们配置一下格式 logging.level.包名或类名: 级别 即可, 举例如下
  1. logging:
  2. pattern:
  3. console: "%d - %msg%n"
  4. #path: e:/
  5. file: e:/sell.log
  6. level:
  7. #这里可以是包名也可以是类名
  8. com.lonely: debug

运行后,我们可以看到 原来只能看到 info 和 error 的,现在的debug也可以看到




3.2 lobback-spring.xml 配置

1. 我们先把 application.yml的关于日志的注释掉,新建一个文件  logback-spring.xml,为什么要取这个名字呢,Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),如果我们想自定义名字,也可以,可以在 application.yml中通过  logging.config=classpath:/xxx.xml等方式配置。

2.  注意几个 xml节点的含义
appender:配置项,规则,通过这个节点内容配置,我们可以配置输出位置(控制台,文件),输出格式等
root:根节点,表明整个项目基本的日志级别,里面可以应用多个appender规则
     demo如下:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.  
  4. <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
  5. <layout class="ch.qos.logback.classic.PatternLayout">
  6. <pattern>%d -- %msg%n</pattern>
  7. </layout>
  8. </appender>
  9.  
  10. <root level="info">
  11. <appender-ref ref="consoleLog" />
  12. </root>
  13. </configuration>

在上面的 logback-spring.xml中,appender配置了一个规则, ConsoleAppender表明日志输出到控制台,layout表明输出格式,root节点配置表明该项目基础的日志级别为info,引入 控制台输出的规则,那么我们运行看结果


从结果上来看,配置的是 info级别,所以 debug的没有输出,现在如果我想把日志输出到文件怎么处理呢,可以使用如下配置,添加一个 appender规则,由于日志可能比较多,一般是按照日期来输出日志,因此如下配置了每天一个日志到指定位置
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.  
  4. <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
  5. <layout class="ch.qos.logback.classic.PatternLayout">
  6. <pattern>%d -- %msg%n</pattern>
  7. </layout>
  8. </appender>
  9.  
  10. <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  11. <encoder>
  12. <pattern>%d -- %msg%n</pattern>
  13. </encoder>
  14. <!--滚动策略-->
  15. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  16. <!--路径-->
  17. <fileNamePattern>e:/info-%d.log</fileNamePattern>
  18. </rollingPolicy>
  19. </appender>
  20.  
  21. <root level="info">
  22. <appender-ref ref="consoleLog" />
  23. <appender-ref ref="fileInfoLog"/>
  24. </root>
  25. </configuration>

3. 如果我们想 把 info 的日志 和  error的日志区分到两个文件放置,该怎么写呢?

我们现在 在新建一个规则,结构如上图,只是在里面添加了一个过滤器,使用的是范围过滤,也就是拦截Error级别的信息,demo如下
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.  
  4. <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
  5. <layout class="ch.qos.logback.classic.PatternLayout">
  6. <pattern>%d -- %msg%n</pattern>
  7. </layout>
  8. </appender>
  9.  
  10. <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  11. <encoder>
  12. <pattern>%d -- %msg%n</pattern>
  13. </encoder>
  14. <!--滚动策略-->
  15. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  16. <!--路径-->
  17. <fileNamePattern>e:/info-%d.log</fileNamePattern>
  18. </rollingPolicy>
  19. </appender>
  20.  
  21. <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  22. <!--添加 范围 过滤-->
  23. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  24. <level>ERROR</level>
  25. </filter>
  26. <encoder>
  27. <pattern>%d -- %msg%n</pattern>
  28. </encoder>
  29. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  30. <fileNamePattern>e:/error-%d.log</fileNamePattern>
  31. </rollingPolicy>
  32. </appender>
  33.  
  34. <root level="info">
  35. <appender-ref ref="consoleLog" />
  36. <appender-ref ref="fileInfoLog"/>
  37. <appender-ref ref="fileErrorLog"/>
  38. </root>
  39. </configuration>

运行后,我们可以在 e盘下的 error.log中看到 里面只有一条记录,关于error的记录,但是我们在info的那个文件中,依旧有info和error的信息,那么如果将info提取出来呢? 能不能也想这样添加一个过滤器呢,测试一下,经过测试我们发现没有作用,因为拦截info,error还是会显示,因为error的优先级高,那么我们可以利用如下方法来处理,demo如下:


  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.  
  4. <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
  5. <layout class="ch.qos.logback.classic.PatternLayout">
  6. <pattern>%d -- %msg%n</pattern>
  7. </layout>
  8. </appender>
  9.  
  10. <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  11. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  12. <!--要拦截的日志级别-->
  13. <level>ERROR</level>
  14. <!--如果匹配,则禁止-->
  15. <onMatch>DENY</onMatch>
  16. <!--如果不匹配,则允许记录-->
  17. <onMismatch>ACCEPT</onMismatch>
  18. </filter>
  19. <encoder>
  20. <pattern>%d -- %msg%n</pattern>
  21. </encoder>
  22. <!--滚动策略-->
  23. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  24. <!--路径-->
  25. <fileNamePattern>e:/info-%d.log</fileNamePattern>
  26. </rollingPolicy>
  27. </appender>
  28.  
  29. <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
  30. <!--添加 范围 过滤-->
  31. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  32. <level>ERROR</level>
  33. </filter>
  34. <encoder>
  35. <pattern>%d -- %msg%n</pattern>
  36. </encoder>
  37. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  38. <fileNamePattern>e:/error-%d.log</fileNamePattern>
  39. </rollingPolicy>
  40. </appender>
  41.  
  42. <root level="info">
  43. <appender-ref ref="consoleLog" />
  44. <appender-ref ref="fileInfoLog"/>
  45. <appender-ref ref="fileErrorLog"/>
  46. </root>
  47. </configuration>

运行后,发现确实实现了  info 和 error的日志分开,但是 在上图例子中,虽然我们排除了 error,但是除开info,如果我们还有 warn级别的日志信息,还是会输出在 info.log文件中,因为warn优先级比info高,但是我们只是拦截了error而已。


以上就是 关于  slf4j日志的总结,边学边敲边分享~




日志:slf4j+logback 的配置与使用的更多相关文章

  1. (八)slf4j+logback 的配置与使用

    logback的配置看这篇:https://www.cnblogs.com/lvchengda/p/13054457.html 使用 @Slf4j 1)安装插件lombok 在eclipse/myec ...

  2. 关于日志slf4j+logback&logback.xml配置

    1.maven依赖 <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <!-- <dependen ...

  3. slf4j/logback: logging日志的配置

    slf4j/logback: logging日志的配置 import依赖: import org.slf4j.Logger;import org.slf4j.LoggerFactory;private ...

  4. 【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)

    Log4j Apache的一个开放源码项目,通过使用Log4j,我们能够控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等.用 ...

  5. 在android中使用logback-android日志框架配置 slf4j + logback

    为什么使用 slf4j + logback logbak定位于log4j的替代者,logback同样支持slf4j,方便被替换.在Android平台上,我在使用log4中遇到tag混乱的问题.相比lo ...

  6. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  7. 日志组件logback的介绍及配置使用方法

    一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-acc ...

  8. Java日志框架 (commons-logging,log4j,slf4j,logback)

    转自:http://blog.csdn.net/kobejayandy/article/details/17335407 如果对于commons-loging.log4j.slf4j.LogBack等 ...

  9. 使用logback.xml配置来实现日志文件输出

    转自:http://sungang-1120.iteye.com/blog/2104296 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback- ...

随机推荐

  1. python 装饰器 (test = submit(test))

    两层的装饰器,这里对于register不需要进行输入 usename, passwd = 'alex', 'abc123' def register(func): def wrapper(*args, ...

  2. 使用oracle的存储过程的例子

    十几年没有用oracle的存储过程了,有些东西已经忘了,没有想到今天又要用.在这里写个例子.它演示了存储过程的格式,游标的使用,循环.判断的使用,还有直接执行一个拼接的SQL的用法.以下是代码: cr ...

  3. Python:目录

    ylbtech-Python:目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtec ...

  4. 六十七:flask上下文之Local线程隔离对象

    Local对象在flask中,类似于request对象,其实是绑定到了werkzeug.local.Local对象上,这样即使是同一个对象,在多线程中都是隔离的,类似的对象还有session以及g对象 ...

  5. 数据库字段和实体类和map中对应类型

    http://blog.csdn.net/sxe18652071425/article/details/46416217 地址 MySQL数据类型 JAVA数据类型 JDBC TYPE 普通变量类型 ...

  6. (转)java8实现对象列表去重

    java8实现列表去重,java8的stream和lambda的使用实例 通过普通的方式也可以达到去重的效果,但是借助java8新特性可以很方便的实现列表去重,测试demo如下 实体类: public ...

  7. 根据json生成java实体类

    之前一篇讲过了XML转java实体对象,使用的是JAXB技术,今天给大家推荐一个在线转json到java实体对象: http://www.bejson.com/json2javapojo/new/ 转 ...

  8. linux系统中vi点击上下左右键后出现ABCD,没有移动光标

    终端(terminal)中输入 vi /etc /vim/vimrc.tiny 在打开的文件中修改 1. 将 set compatible  修改为  set nocompatible 在下一行加入 ...

  9. PHP $_SERVER超全局变量

    $_SERVER是php中的超全局变量,一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web 服务器创建. ...

  10. HTTP 请求中的 Form Data 与 Request Payload 的区别

    HTTP 请求中的 Form Data 与 Request Payload 的区别 前端开发中经常会用到 AJAX 发送异步请求,对于 POST 类型的请求会附带请求数据.而常用的两种传参方式为:Fo ...