sprigboot-日志
日志简介
常见日志名词
- JCL(jakarta Commons Logging)
- SELF4J(Simple Logging Facade for Java)
- jboss-logging
- log4j
- JUL(java.util.logging)
- log4j2
- logback
接口分类: JCL
,SELF4J
,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 |
配置步骤
- 保证路径畅通
接口 + 适配 + 实现
- 其他框架替换
用替换包替换其他原有日志实现包
日志框架调整
配置查看
-
打开pom文件
-
右键,点击如下菜单
-
选择布局
具体布局样式看个人喜好
显示依赖如图
- 安装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
|
- 其中log4j和logback统一使用self4j进行调用
- 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
|
实现 | 不同日志具体实现 |
- 为了让self4j直接调度具体实现,需要对接上接口,或者通过适配层对接接口
- self4j能够自动识别具体实现包,所以需要更换名称来屏蔽视听。
- self4j直接识别具体实现,并自动关联适配层,进行逻辑连接。
切换办法
因此,对于我们想要通过self4j进行调用的包,我们要打通self4j
+ 适配
+ 实现
,为了避免冲突,我们需要把替换包给移除掉。
对于想直接调用,而不交由self4j
进行管理调用的包,需要用替换包进行替换,同时移除原来的相关包。
总结一下
预期 | 接口 | 替换 | 适配 | 实现 |
---|---|---|---|---|
self4j + log
|
self4j |
needless |
need |
need |
log |
needless |
need |
needless |
needless |
- 由于Spring-Boot提供了替换包,因此不需要外部再导入实现包
- 替换包和适配包两者冲突
- 接口和适配同状态配置
至此,我们就能够对self4j
管理或者不需要进行管理的日志实现有一个清晰的逻辑概念和规划,也有依据对日志框架进行配置和调整了。
日志配置
self4j日志级别
trace
debug
info
warn
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
,一般的trace
和debug
的日志不会进行打印。
输出级别配置
# 指定包下日志级别
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:
- 绝对路径则输出到指定路径(文件),否则输出到当前路径下的指定路径(文件)中。
- 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
- 配置 : spring.profile.activate=dev
- 参数 :–spring.profile.activete=dev
- jvm : -Dspring.profile.activate=dev
当不**时,默认环境名称叫做default,并不会采用你所定义的某一个配置作为默认哦!