springboot的日志概述
级别的控制:
- TRACE
<
DEBUG<
INFO<
WARN<
ERROR<
FATAL - 默认的springboot设置为info,只会在控制台里面输出info和大于info的(error和warn)
- 如果以debug的方式启动,会将debug的信息也输出到控制台里面,但是日志的级别实际还是没有变
- 设置日志的级别:
- 格式为‘logging.level.* = LEVEL’
- LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
- 具体的可以设置为logging.level.com.qp=DEBUG 代表着com.qp包下的所有Class都以debug级别输出--------就是将除了trace的全都输出到控制台
输出位置的控制:
-
正常情况下只会在控制台里面进行输出,不会写到日志文件,如果想要编写控制台输出之外的日志文件,需要设置logging.file或logging.path属性
-
logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
-
logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log
-
如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。
如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log
-
二者不能同时使用,如若同时使用,则只有logging.file生效
自定义日志配置
----暂时我用不到------
由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项(下面会提到)。
上面是默认的命名规则,并且放在src/main/resources下面即可。
如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,可以通过logging.config属性指定自定义的名字:logging.config=classpath:logging-config.xml
日志框架
- log4j和slf4j区别:
SLF4J——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。
所以就是:
log4j logback commons-logging都是日志的框架
在日志的框架下面还有一层,就是调用这个框架的接口,所有的框架日志接口都是slf4j
- 框架介绍:
默认的日志框架是logback,而且在这里强调一下,logback框架是很强的框架,比Log4j框架是好用很多的,别想着去换成Log4j就行。
- 在正常的项目中,如果想要使用日志,就直接添加个注解@Slf4j (在添加了lombok的基本上),然后直接就可以在项目中使用log.info(xxxxx)了。
- 这个的原理就是:正常的项目里面存在着默认的日志框架logback,我们使用@slf4j来调用这个日志框架使用里面的log.info方法
使用logback框架具体操作
- 自定义日志配置文件:配置文件的寻找过程
- 尝试在 classpath下查找文件logback-test.xml;
- 如果文件不存在,则查找文件logback.xml;
- 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。
- 自己在main的resource下建立一个logback.xml
- 里面具体的语法我寻思着应该都是CV能解决的。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--控制台上的输出-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>return logger.contains("nacos");</expression>
</evaluator>
<OnMatch>DENY</OnMatch>
<OnMismatch>ACCEPT</OnMismatch>
</filter>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!--保存所有的日志信息-->
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/server.log</file>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>return logger.contains("nacos");</expression>
</evaluator>
<OnMatch>DENY</OnMatch>
<OnMismatch>ACCEPT</OnMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./logs/server.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>30MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!--保存WARN的日志-->
<appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/server_warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天一归档 -->
<fileNamePattern>./logs/server_warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--保存error的日志-->
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/server_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天一归档 -->
<fileNamePattern>./logs/server_error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="async-stdout" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="stdout"/>
<includeCallerData>true</includeCallerData>
</appender>
<appender name="async-rollingFile" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="rollingFile"/>
<includeCallerData>true</includeCallerData>
</appender>
<appender name="async-warnFile" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="warnFile"/>
<includeCallerData>true</includeCallerData>
</appender>
<appender name="async-errorFile" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="errorFile"/>
<includeCallerData>true</includeCallerData>
</appender>
<logger name="org.quartz.impl.jdbcjobstore.JobStoreTX" level="INFO"/>
<logger name="org.quartz.impl.jdbcjobstore.StdRowLockSemaphore" level="INFO"/>
<logger name="org.springframework.amqp.rabbit.core.RabbitTemplate" level="INFO"/>
<logger name="org.springframework.amqp.rabbit.listener.BlockingQueueConsumer" level="INFO"/>
<root level="INFO">
<appender-ref ref="async-stdout"/>
<appender-ref ref="async-rollingFile"/>
<appender-ref ref="async-warnFile"/>
<appender-ref ref="async-errorFile"/>
</root>
</configuration>
- 最后会生成这些Log