spring默认的日志
+- org.springframework.boot:spring-boot-starter-actuator:jar:2.1.2.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.1.2.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.1.2.RELEASE:compile
[INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] | | | | \- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.11.1:compile
[INFO] | | | | \- org.apache.logging.log4j:log4j-api:jar:2.11.1:compile
[INFO] | | | \- org.slf4j:jul-to-slf4j:jar:1.7.25:compile
slf4j
slf4j是一个日志框架,它对接不同的日志框架实现。看slf4j的简介:
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowi…
spring-boot-starter-logging
用到spring-boot-starter,就会自动加入spring-boot-starter-logging。
而spring-boot-starter-logging由三部分组成:
- logback-classic:带有SLF4J的适配
- log4j-to-slf4j:log4j日志适配
- jul-to-slf4j:java.util.logging.Logger打印出来的日志,如果要转为slf4j输出
因此spring自带了三种日志框架的适配,所以在springboot应用中,配置log4j参数,还是logback-spring.xml,都可以。
如果应用中含两种以上日志jar,那么看源码LoggingSystem,优先级logback>log4j>jul。
代码使用
使用日志时,就要通用最好了,所以应该使用slf4j的接口,比如:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final Logger log = LoggerFactory.getLogger(getClass());
private static final Logger LOG = LoggerFactory.getLogger(AppServiceImpl.class);
代码中的日志输出记录,包括时间、地点、人物、事件、重要等级:)
另外日志还有其他输出配置,比如按照类或者包等,设置日志输出级别
logging.level.org.eclipse.jetty=INFO
logging.level.org.eclipse.jetty.http.HttpParser=INFO
logging.level.org.eclipse.jetty.server.HttpChannel=warn
logging.level.org.eclipse.jetty.server.Server=warn
logging.level.org.apache.http=INFO
记录输出哪里?
默认输出到控制台的,
由日志框架支持可以输出到控制台、文件、数据库…
每个日志框架中日志的输出包括输出对象,输出格式,输出记录的级别范围。
比如logback的
<appender name="all_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<File>${logback.file.path}/all_debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logback.file.path}/all_debug.%d{yyyy-MM-dd HH:mm}.log
</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
<!--日志文件最大的大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>${logback.file.maxSize}</MaxFileSize>
</triggeringPolicy>
</appender>
比如log4j
log4j.rootLogger=DEBUG,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d --> [%t] %l: %m %x %n
另外spring默认的设置了一些日志的级别,参见LoggingApplicationListener、ClasspathLoggingApplicationListener的代码。
从LoggingApplicationListener入手,看LoggingSystem,再看具体日志框架的实现,logging.level的定义将是最高的,控制哪些代码输出什么级别的日志。
而日志框架则是按照配置,挑选出响应级别的日志来打印输出。