市面上的日志框架

日志门面 (日志的抽象层) 日志实现
JCL(Jakarta Commons Logging)(2014) SLF4j(Simple Logging Facade for Java) jboss-logging Log4j     JUL(java.util.logging)    Log4j2    Logback

补充说明:Logback, Log4j , Log4j2都出于同一作者之手, 但Logback更新。

在使用日志时, 都是选一个左边门面(抽象层)、再选一个右边的实现;该用方法时只用右边门面方法 ,

Spring框架选用JCL日志,需要引用commons-logging.jar ,  SpringBoot框架选用 SLF4j和logback;

每一个日志的实现框架都有自己的配置文件。就算使用slf4j门面,日志实现框架用的还是自己本身的配置文件;

如何让系统中所有的日志都统一到slf4j;

1、将系统中其他日志框架先排除出去 (比如删除log4j.jar;

2、用中间包来替换原有的日志框架 (比如添加log4j-over-slf4j.jar);

3、我们导入slf4j其他的实现

为什么还要jcl-over-slf4j.jar ,log4j-over-slf4j.jar, jul-to-slf4j.jar?

这是一个历史遗留问题  , 因为一个项目只一般不可能只有一个日志框架 , 比如Spring 使用commons-logging , hibernate使用 jboss-logging , MyBatis , XXX等其它框架又用了各自的日志框架, 那么为了把各种框架都整合到一个日志中去输出 , 所以有了这些需要替换原始功能的jar包

SpringBoot日志关系

SpringBoot使用它来做日志功能;

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-logging</artifactId>
  4. </dependency>

底层依赖关系图

总结:

1)、SpringBoot底层也是使用slf4j+logback的方式进行日志记录;

2)、SpringBoot也把其他的日志都替换成了slf4j;

3)、中间替换包(以jck-over-slf4j.jar为例),其实内部被换成了SLF4JLogFactory

  1. @SuppressWarnings("rawtypes")
  2. public abstract class LogFactory {
  3. static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
  4. static LogFactory logFactory = new SLF4JLogFactory();

4)、如果我们要引入其他框架?一定要把这个框架的默认日志依赖移<exclusion>除掉,比如Spring框架用的是commons-logging;

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-core</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>commons-logging</groupId>
  7. <artifactId>commons-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>

日志测试

logback测试用例

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class LoggingTest {
  4. Logger logger = LoggerFactory.getLogger(getClass());
  5. @Autowired
  6. ApplicationContext ac;//注入上下文
  7.  
  8. @Test
  9. public void contextLoads() {
  10. //日志的级别;
  11. //由低到高 trace<debug<info<warn<error
  12. //可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效
  13. logger.trace("这是trace日志...");
  14. logger.debug("这是debug日志...");
  15. //SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别(用了info级别)
  16. logger.info("这是info日志...");
  17. logger.warn("这是warn日志...");
  18. logger.error("这是error日志...");
  19. }
  20. public ApplicationContext getAc() {
  21. return ac;
  22. }
  23. public void setAc(ApplicationContext ac) {
  24. this.ac = ac;
  25. }
  26. }

application.properties配置文件

  1. # springboot日志的配置文件,本处由application.properties中的spring.profiles.active=logging来启用本文件
  2. # 指定log文件,也可以写固定的绝对路径, 如果file和path都指定了,那么file优先级更高
  3. #logging.file=springboot02.log
  4. # 指定log路径,默认使用使用spring.log作为文件名, 如果以/开头,则在当前磁盘的根目录下创建路径,如果不以/开头,则在当前应用目录下创建日志路径
  5. logging.path=/springbootlog01/logs
  6.  
  7. # 日志占位符说明
  8. # %d表示日期时间
  9. # %thread表示线程名
  10. # %-5level:级别从左显示5个字符宽度,左对齐
  11. # %logger{50} 表示logger包路径加类名字最长50个字符
  12. # %msg:日志消息
  13. # %n是换行符
  14.  
  15. # 在控制台输出的日志的格式
  16. logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
  17. # 指定文件中日志输出的格式
  18. logging.pattern.file=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
  19.  
  20. # 指定com下的所有日志输出级别为trace
  21. logging.level.com=trace

logback默认配置位于该目录: spring-boot-1.5.14.RELEASE.jar!/org/springframework/boot/logging/logback/defaults.xml和base.xml

日志配置

给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了

日志系统 自定义文件 说明  
Logback logback.xml 直接被日志框架识别,不经过springboot , 不支持SpringBoot的profile功能.  
Logback logback-spring.xml 日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能  
Log4j2 log4j2.xml    
Log4j2 log4j2-spring.xml    
JDK (Java Util Logging) logging.properties    

logback-spring.xml 使用SpringBoot的profile功能如下:

  1. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  2. <!--
  3. 日志输出格式:
  4. %d表示日期时间,
  5. %thread表示线程名,
  6. %-5level:级别从左显示5个字符宽度
  7. %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
  8. %msg:日志消息,
  9. %n是换行符
  10. -->
  11. <layout class="ch.qos.logback.classic.PatternLayout">
  12. <springProfile name="dev">
  13. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
  14. </springProfile>
  15. <springProfile name="!dev">
  16. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
  17. </springProfile>
  18. </layout>
  19. </appender>

日志切换

  slf4j+log4j的方式 (已亲测)  processon地图 log4j2 (未亲测)  
pom.xml内容 
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <!--排队具体的日志实现logback-->
  6. <exclusion>
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-classic</artifactId>
  9. </exclusion>
  10. <!--排队log4j的替换包-->
  11. <exclusion>
  12. <groupId>org.slf4j</groupId>
  13. <artifactId>log4j-over-slf4j</artifactId>
  14. </exclusion>
  15. </exclusions>
  16. </dependency>
  17.  
  18. <!--使用log4j的适配层,它底层依赖log4j.jar,所以不用再导log4j.jar了,在classpath根目录放一个log4j.properties即可 -->
  19. <dependency>
  20. <groupId>org.slf4j</groupId>
  21. <artifactId>slf4j-log4j12</artifactId>
  22. </dependency>
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <artifactId>spring-boot-starter-logging</artifactId>
  7. <groupId>org.springframework.boot</groupId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11.  
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-log4j2</artifactId>
  15. </dependency>
 
 说明  此处直接去掉了slf4j的实现 , 必须换成log4j的实现  此处引用的是spring-boot-starter-log4j2场景启动器,替换了spring-boot-starter-logging场景启动器的功能  
       

自己喜欢的简易风

日志配置

  1. # 在控制台输出的日志的格式
  2. logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss}\t↓%n%msg%n

日志格式

  1. 2019-12-04 09:59:37
  2. Root WebApplicationContext: initialization completed in 813 ms
  3. 2019-12-04 09:59:38
  4. Initializing ExecutorService 'applicationTaskExecutor'
  5. 2019-12-04 09:59:38
  6. Tomcat started on port(s): 8080 (http) with context path '/es'
  7. 2019-12-04 09:59:38

springboot 日志【转】【补】的更多相关文章

  1. 功能:SpringBoot日志配置详情

    SpringBoot日志配置详情 一.介绍 在所有的项目中,日志是必不可少的,为了高效清晰的查找日志,可以配置日志输出的等级和格式. 在配置后,可以自定义输出日志到指定目录,可以按照天数来分割日志,可 ...

  2. ELK实战(Springboot日志输出查找)

    需求 把分布式系统,集群日志集中处理快速查询 搭建ELK并与springboot日志输出结合 搭建ELK 基于我前面的elasticsearch搭建博客文档docker-compose.yml基础上进 ...

  3. SpringBoot Logback配置,SpringBoot日志配置

    SpringBoot Logback配置,SpringBoot日志配置  SpringBoot springProfile属性配置 ================================ © ...

  4. springboot 日志2

      SpringBoot关于日志的官方文档 1.简述 SpringBoot官方文档关于日志的整体说明 本博客基于SpringBoot_1.3.6大家请先简单看下这篇英文的官方文档,文中有说 Sprin ...

  5. JAVAEE——SpringBoot日志篇:日志框架SLF4j、日志配置、日志使用、切换日志框架

    Spring Boot 日志篇 1.日志框架(故事引入) 小张:开发一个大型系统: ​ 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件 ...

  6. Springboot 日志管理配置logback-spring.xml

    几种常见的日志 Log4j:是最早的日志框架,是apach旗下的,可以单独使用,也可配合日志框架JCL使用: Log4j2:apach旗下的关于log4j的升级版: Logback:是基于slf4j接 ...

  7. SpringBoot日志管理

    一.简介 小张:开发一个大型系统:1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件?2.框架来记录系统的一些运行时信息:日志框架 : z ...

  8. Springboot日志配置探索(主要看logback)(一)

    这篇博客是springboot日志配置探索的第一篇,主要讲默认配置下springboot的logback日志框架的配置(即直接使用是怎样的) 首先,是一个SpringBoot的有关日志的说明文档:ht ...

  9. springBoot日志框架自动配置与原理

    1.日志框架 小张:开发一个大型系统: ​ 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? ​ 2.框架来记录系统的一些运行时信息: ...

随机推荐

  1. MT【278】二次齐次化

    对于$c>0$,当非零实数$a,b$满足$4a^2-2ab+4b^2-c=0,$且使$|2a+b|$最大时,$\dfrac{3}{a}-\dfrac{4}{b}+\dfrac{5}{c}$的最小 ...

  2. 集群概念Cluster

    系统扩展方式: scale up,向上扩展:提高主机性能等,质变: scale out,向外扩展:水平扩展,质不变量变: 集群类型: LB:Load Balancing 负载均衡集群: HA:High ...

  3. 【BZOJ3874】[AHOI&JSOI2014]宅男计划(贪心,三分)

    [BZOJ3874][AHOI&JSOI2014]宅男计划(贪心,三分) 题面 BZOJ 洛谷 题解 大力猜想一最长的天数和购买外卖的总次数是单峰的.感性理解一下就是买\(0\)次是\(0\) ...

  4. 【APIO2018】新家(线段树)

    [APIO2018]新家(线段树) 题面 UOJ 洛谷 BZOJ 题解 论比赛时想不到二分的危害,就只能Cu滚粗 既然不要在线,那么考虑离线做法. 既然时间是区间,那么显然按照时间顺序处理答案. 显然 ...

  5. css颜色表示法

    css颜色值主要有三种表示方法: 1.颜色名表示,比如:red 红色,gold 金色 2.rgb表示,比如:rgb(255,0,0)表示红色 3.16进制数值表示,比如:#ff0000 表示红色,这种 ...

  6. 不是说记住rm -rf的教训就够了

    不是说记住rm -rf的教训就够了 李阿玲· 12 天前 2013年,我在同步CTAN镜像的时候,在/home下我的文件夹里面操作了下面的命令: rsync -av --delete rsync:// ...

  7. VMware配置centos虚拟机静态ip

    1. 安装centos,这个自己安装就好了 2. 配置配置虚拟机静态ip桥接器 配置ip地址 2. 配置网络共享中心 这里面的默认网关填写之前我们配置的网络网关ip默认为192.168.6.2 3. ...

  8. jsp (1)

    一.jsp介绍: jsp是servlet的一种包装.是html+js+css+servlet. jsp文件无需配置,如果修改了jsp文件不需要reload应用. jsp访问方法:直接访问文件名.jsp ...

  9. css预编译语言sass——mixin的使用

    以根据不同屏幕吃寸动态应用背景图片为例 新建一个mixin如下: @mixin bg_img($path, $ext){ @media screen and (max-device-width: 76 ...

  10. Git中撤销提交

    Git的几种状态 未修改 原始内容 已修改 ↓ 工 作 区 已暂存 ↓ git add 暂 存 区 已提交 ↓ git commit 本地仓库 已推送 ↓ git push 远程仓库 注意:下面所有命 ...