@Conditional及其派生注解

​ 原理:必须是@Conditional指定的条件成立,才会给容器中添加组件,配置在里面的所有内容才生效;

@Conditional派生注解 作用(判断是否满足指定要求)
@ConditionalOnjava 系统的java版本是否符合
@ConditionalOnBean 容器中存在指定Bean
@ConditionalOnMissingBean 容器中不存在指定Bean
@ConditionalOnExpression 满足SpEl表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者找个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定的资源文件
@ConditionalOnWebApplication 当前工程是否是web工程
@ConditionalOnNotWebApplication 当前工程不是web工程
@ConditionalOnJndi JNDI存在指定项

Springboot与日志

1、日志框架

市面上的日志框架

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…

日志门面(日志抽象层) 日志实现
JCL、SLF4J、jboss-logging Log4j 、JUL、Log4j2、Logback

左边选一个门面(抽象层)、右边选一个实现;

Springboot : 底层是Spring框架,Spring框架默认使用JCL;

Springboot将日志层进行了升级封装,选用SLF4j和logback

2、SLF4j使用

给系统里面导入slf4j和logback的实现jar;

每一个日志的实现框架都有自己的配置文件。使用slf4j,配置文件还是做成日志实现框架的配置文件;

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

1、使用中间包来替换原有的日志框架;

2、导入slf4j的其他实现

3、Springboot日志关系

Springboot最基本的依赖:starter

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
</dependency>

Springboot使用它来做日志功能:

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <scope>compile</scope>
 </dependency>

Spring-boot-starter-logging的依赖关系,可以将其他的日志框架统一转换成slf4j(适配器模式

在这里插入图片描述

那么Springboot是如何进行转换的呢,我们点开log4j-to-slf4j看一下:

其实是直接将log4j的实现由slf4j的实现替代,从而达到转换的效果

在这里插入图片描述

总结:

1)、Springboot底层也是使用slf4j+logback的方式进行日志记录(2.x支持log4j)

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

3)、通过一些中间替换包进行转换(适配器模式)

4、日志使用

1、默认配置

springboot默认给我们配置好了日志

// 记录器
Logger logger = LoggerFactory.getLogger(SpringLoggingApplicationTests.class);

@Test
void contextLoads() {
    //    日志级别;
    //    由低到高,默认info起步,低于配置级别的日志不会显示
    //    可以调整输出的日志级别。
    logger.trace("这是track日志。。");
    logger.debug("这是debug日志..");
    logger.info("这是info日志...");
    logger.warn("这是warn日志...");
    logger.error("这是error...");
}

可以在配置文件中修改日期级别:

# logging.level.需要修改级别的包名=日志级别
logging.level.com.github=trace

也可以在命令行手动改变日志级别:

java -jar xxx.jar --trace

2、日志格式

Spring Boot的默认日志输出类似于以下示例:

2020-05-17 15:16:28.552  INFO 10412 --- [           main] c.g.s.SpringLoggingApplicationTests      : Starting SpringLoggingApplicationTests on LAPTOP-UPVRKKQD with PID 10412 (started by 93985 in D:\java\spring-logging)
2020-05-17 15:16:28.556 DEBUG 10412 --- [           main] c.g.s.SpringLoggingApplicationTests      : Running with Spring Boot v2.2.2.RELEASE, Spring v5.2.2.RELEASE
2020-05-17 15:16:28.563  INFO 10412 --- [           main] c.g.s.SpringLoggingApplicationTests      : No active profile set, falling back to default profiles: default
2020-05-17 15:16:31.056  INFO 10412 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-05-17 15:16:31.395  INFO 10412 --- [           main] c.g.s.SpringLoggingApplicationTests      : Started SpringLoggingApplicationTests in 3.36 seconds (JVM running for 4.951)

从左到右依次是:

1)Date and Time : 日期和时间

2)Log Level :日志级别

3)Process ID :进程id

4)— :分隔符

5)Thread Name :线程名字

6)Logger Name :日志名称,通常是类名

7)日志信息

3、将日志输出到文件

默认情况下,Springboot只会在控制台输出日志信息

若我们想要将日志信息输出到日志文件中,有两种方法:

1)、日志输出到一个文件中

将日志信息输出到项目根目录下,一个叫spring.log的文件下

logging.file.name=spring.log
2)、日志输出到一个文件夹下

将日志信息输出到项目根目录下,一个叫spring的文件夹下的log文件夹中的spring.log(Springboot的默认日志文件)

logging.file.path=/spring/log

4、自定义日志配置

优先级从左往右

日志系统 自定义日志配置
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

为了帮助进行自定义,一些其他属性从Spring转移 Environment到System属性,如下表所述:

Spring Environment 系统属性 备注
logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD 记录异常时使用的转换字
logging.file LOG_FILE 如果已定义,则在默认日志配置中使用它。
logging.file.max-size LOG_FILE_MAX_SIZE 最大日志文件大小(如果启用了LOG_FILE)(仅支持默认的Logback设置。)
logging.file.max-history LOG_FILE_MAX_HISTORY 要保留的最大归档日志文件数(如果启用了LOG_FILE)。(仅支持默认的Logback设置。)
logging.path LOG_PATH 如果已定义,则在默认日志配置中使用它。
logging.pattern.console CONSOLE_LOG_PATTERN 要在控制台上使用的日志模式(stdout)。(仅支持默认的Logback设置。)
logging.pattern.dateformat LOG_DATEFORMAT_PATTERN 日志日期格式的Appender模式。(仅支持默认的Logback设置。)
logging.pattern.file FILE_LOG_PATTERN 要在文件中使用的日志模式(如果LOG_FILE已启用)。(仅支持默认的Logback设置。)
logging.pattern.level LOG_LEVEL_PATTERN 呈现日志级别时使用的格式(默认%5p)。(仅支持默认的Logback设置。)
PID PID 当前进程ID(如果可能,则在未定义为OS环境变量时发现)。

今天的事情比较多,所以内容比较少,以上…


版权声明:本文为WXZCYQ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/WXZCYQ/article/details/106186518