记录一下spring日志

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默认的设置了一些日志的级别,参见LoggingApplicationListenerClasspathLoggingApplicationListener的代码。
LoggingApplicationListener入手,看LoggingSystem,再看具体日志框架的实现,logging.level的定义将是最高的,控制哪些代码输出什么级别的日志。
而日志框架则是按照配置,挑选出响应级别的日志来打印输出。


版权声明:本文为mlz_2原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。