sprigboot-日志

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/82914641

日志简介

常见日志名词

  1. JCL(jakarta Commons Logging)
  2. SELF4J(Simple Logging Facade for Java)
  3. jboss-logging
  4. log4j
  5. JUL(java.util.logging)
  6. log4j2
  7. logback

接口分类: JCLSELF4J,jboss-logging

具体实现:log4j,JUL,log4j2,logback

信息梳理

名称 类别 背景 相关
JCl(jakarta Commons Loging) 接口 1. Apache-jakarta小组开 很久不更新
SELF4J(Simple Logging Facade for Java) 接口 大牛接口 大牛开发
jboss-logging 接口 jboss开发 特定场景
log4j 实现 大牛开发 大牛开发一版
log4j2 实现 apache冠名log4j而开发 由于过于强悍而超纲
导致市面没日志接口能完全适配
JUl(java.util.logging) 实现 java工具包 受log4j刺激而生
logback 实现 大牛二 大牛log4j改版

使用办法

Spring-Boot默认日志

Spring:默认使用JCL

Spring-Boot:默认使用SELF4J + logback

日志基本使用

更多信息参看self4j官网

直接使用接口,底层自动关联实现

需要同时导入抽象层接口(self4j)和具体实现(logback)

 import org.self4j.Logger;
 import org.self4j.LoggerFactory;

 public class HelloWorld {
   static Logger logger = LoggerFactory.getLogger(HelloWorld.class);
   public static void main(String[] args) {
	logger.info("Hello World");
   }
 }

日志框架适配

self4j只是接口实现,只有规范操作的定义,并没有具体的操作细节。

理论上只要适配接口,都可以通过顶层接口来调用不同的具体实现。

虽然self4j和logback是原生组合,但是也可以通过适配来调用其他具体的日志实现。

在这里插入图片描述

按照官方的图示进行配置,就可以进行self4j+log的办法进行使用了。

接口*(jar)* 适配层*(jar)* 日志实现*(jar)* 日志位置
self4j(self4j-api.jar) none none /dev/null
self4j(self4j-api.jar) needless logback-classic.jar
logback-core.jar
logback
self4j(self4j-api.jar) self4j-log412.jar log4j.jar log4j
self4j(self4j-api.jar) self4j-jdk14.jar java.util.logging(JVM自带) JVM
self4j(self4j-api.jar) needless self4j-simple.jar(self4j简单实现) self4j
self4j(self4j-api.jar) needless self4j-nop.jar(self4j空实现) /dev/null

日志配置文件

根据使用的具体实现,采取对应的配置文件即可。

日志接口统一

在多个日志框架同时存在时,顶层需要统一使用slf4j时,如何配置呢?

日志实现替换

self4j + logback 兼容其他框架日志
在这里插入图片描述

self4j + log4j 兼容其他日志框架
在这里插入图片描述

self4j + jcl 兼容其他日志框架
在这里插入图片描述

日志实现覆盖

日志实现 替换文件
JCL jcl-over-self4j.jar
log4j log4j-over-self4j.jar
JUL jul-to-self4j.jar
logback needless

logback直接使用,不用任何覆盖

日志替换+适配

日志实现 原生jar 替换jar 适配jar
JCl ·commons-logging.jar jcl-over-self4j.jar self4j-jcl.jar
log4j log4j.jar log4j-over-self4j.jar self4j-log412.jar
JUL JVM jul-to-self4j.jar self4j-jdk14.jar
logback logback-classic.jar
logback-core.jar
needless needless

配置步骤

  1. 保证路径畅通

接口 + 适配 + 实现

  1. 其他框架替换

用替换包替换其他原有日志实现包

日志框架调整

配置查看

  1. 打开pom文件

  2. 右键,点击如下菜单
    在这里插入图片描述

  3. 选择布局
    在这里插入图片描述

具体布局样式看个人喜好

显示依赖如图
在这里插入图片描述

  • 安装ctrl可以进行拖动操作
  • ctrl + 滚轮可以进行放大缩小操作
  • alt可以使用放大镜进行查看

使用ide为IDEA,其他ide不适用

配置分析

可以看到并进行如下分析

接口 实现 替换 适配 结果
log4j jul jul-to-self4j none jul
log4j log4j-api none log4j-to-self4j self4j + log4j
log4j logback none none self4j + logback
  1. 其中log4j和logback统一使用self4j进行调用
  2. jul使用方法不变,不可通过self4j直接进行调用

替换实现

换汤不换药,实现没动,改了名称而已
在这里插入图片描述

中间转换的替换包,只是外部进行了名称的变更,内部实现调用的仍然是原有包逻辑。

为什么要做中间替换?

​ 这里是self4j的中间适配,为了能够让self4j能够调用这些包的功能,需要把功能按照self4j

的接口定义进行划分。

PS :

​ Spring-Boot默认提供了替换包,只是进行了再封装,底层调用的仍然是原有的逻辑实现。

​ 如果有手动添加的对应包依赖,应当进行移除,否则会和已经导入的包发生冲突。

pom依赖排除

pom导入jar包时,会把依赖的jar包也进行导入,当我们需要导入jar却不希望同时引入某一个依赖时,咋办?

<dependency>
	<groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <!-- 通过exclusion进行指定依赖包的排除-->
    <exclusions>
    	<exclusion>
        	<groupId>commons-logging</groupId>
            <artifactId>commins-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 关于commons-logging 在新版本中Spring-Boot已经做过调整-->

日志框架切换总结

关系梳理

层级 作用
接口 统一调度,统一使用
替换 替换包更换名称,保留原日志实现功能,不影响顶层调度
适配 让底层实现适用于顶层接口,限定为self4j
实现 不同日志具体实现
  1. 为了让self4j直接调度具体实现,需要对接上接口,或者通过适配层对接接口
  2. self4j能够自动识别具体实现包,所以需要更换名称来屏蔽视听。
  3. self4j直接识别具体实现,并自动关联适配层,进行逻辑连接。

切换办法

​ 因此,对于我们想要通过self4j进行调用的包,我们要打通self4j + 适配 + 实现,为了避免冲突,我们需要把替换包给移除掉。

​ 对于想直接调用,而不交由self4j进行管理调用的包,需要用替换包进行替换,同时移除原来的相关包。

总结一下

预期 接口 替换 适配 实现
self4j + log self4j needless need need
log needless need needless needless
  1. 由于Spring-Boot提供了替换包,因此不需要外部再导入实现包
  2. 替换包和适配包两者冲突
  3. 接口和适配同状态配置

至此,我们就能够对self4j管理或者不需要进行管理的日志实现有一个清晰的逻辑概念和规划,也有依据对日志框架进行配置和调整了。

日志配置

self4j日志级别

  1. trace
  2. debug
  3. info
  4. warn
  5. error
 import org.self4j.Logger;
 import org.self4j.LoggerFactory;

 public class HelloWorld {
   static Logger logger = LoggerFactory.getLogger(HelloWorld.class);
   public static void main(String[] args) {
       logger.trace("Hello World");
 	   logger.debug("Hello World");
       logger.info("Hello World");
       logger.warn("Hello World");
       logger.error("Hello World");
   }
 }

优先级按照顺序从低到高。

日志级别控制

指定输出日志级别之后,只打印此级别和优先级跟高的日志,优先级较低的日志不打印。

默认级别

Spring-Boot默认输出日志级别为info,一般的tracedebug的日志不会进行打印。

输出级别配置

# 指定包下日志级别
logging.level.com.godme=info
# 指定文件日志级别
logging.level.com.godme.test=warn
# 未指定级别采用Spring-Boot默认日志级别info

日志文件配置

# 指定日志输出文件
logging.file=/var/log/log.log
# 指定日志输出路径,默认输出文件为spring.log,没有则自动创建
logging.path=/var/log
logging.path logging.file influence
none none 输出到控制台
dir none 输出到dir/spring.log (推荐)
none file 输出到file
dir file 输出到file

PS:

  1. 绝对路径则输出到指定路径(文件),否则输出到当前路径下的指定路径(文件)中。
  2. logging.path和logging.file为冲突设置,同时设置file起作用。

日志格式配置

# 控制台日志输出格式
logging.pattern.console=
# 日志文件输出格式
logging.pattern.file=

一般格式说明

logging.pattern.file="%d{yyyy-MM-dd  HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n"
# 1. 时间 : %d{yyyy-MM-dd  HH:mm:ss.SSS}
# 2. 线程 :  %thread
# 3. 级别 : %-5level
# 4. logger:%logger{80}
# 5. 信息 : %msg
# 6. 换行 : %n

具体这篇博文有详细讲解。

也可以参照官方文档.

自定义日志配置文件

日志框架 文件名称
logback logbackxml or logback-spring.xml
JUL logging.properties
log4j2 log4j2.xml or log4j2-spring.xml

官方文档

<springProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev, staging">
	<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
	<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
<!-- *-spring.xml 日志配置可配置profile环境采用不同配置 -->

例子

<layout class="ch.qos.logback.clssic.PatternLayout">
	<springProfile name="dev">
        <!-- dev下的日志格式-->
    	<pattern>%d{yyyy-MM-dd  HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
    </springProfile>
    <springProfile name="test">
        <!-- test 下的日志格式-->
    	<pattern>%d{yyyy-MM-dd} %-5level %logger{80} - %msg%n</pattern>
    </springProfile>
</layout>

记得激活Spring-Boot的profile

  1. 配置 : spring.profile.activate=dev
  2. 参数 :–spring.profile.activete=dev
  3. jvm : -Dspring.profile.activate=dev

当不激活时,默认环境名称叫做default,并不会采用你所定义的某一个配置作为默认哦!

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/82914641