企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # Spring Boot 默认日志格式是 ~~~ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n # %d{yyyy-MM-dd HH:mm:ss.SSS} 时间 # %thread 线程名称 # %-5level 日志级别从左显示5个字符宽度 # %logger{50} 类名 # %msg%n 日志信息加换行 ~~~ * 时间日期:精确到毫秒 * 日志级别:ERROR, WARN, INFO, DEBUG or TRACE * 进程ID * 分隔符:— 标识实际日志的开始 * 线程名:方括号括起来(可能会截断控制台输出) * Logger名:通常使用源代码的类名 * 日志内容 至于为什么 Spring Boot 的默认日志输出格式是这样? ![](https://img.kancloud.cn/5e/0f/5e0f2e234e900df3da3580a12214c978_898x340.png) # 日志简介 需要注意的是,要为系统导入 SLF4J 的 jar 和 日志框架的实现 jar. 由于每一个日志的实现框架都有自己的配置文件,所以在使用 SLF4 之后,配置文件还是要使用实现日志框架的配置文件。 ~~~ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } } ~~~ # 统一日志框架的使用 一般情况下,在项目中存在着各种不同的第三方 jar ,且它们的日志选择也可能不尽相同. 显然这样是不利于我们使用的,那么如果我们想为项目设置统一的日志框架该怎么办呢? **统一日志框架使用步骤归纳如下**: 1. 排除系统中的其他日志框架。 2. 使用中间包替换要替换的日志框架。 3. 导入我们选择的 SLF4J 实现。 我们自行排除依赖时也只需要按照图中的方式就好了。 ![](https://img.kancloud.cn/d0/82/d0827d173602e64d0a6f65fb65fe7b35_535x701.png) **统一框架引入替换包** 其实 Spring Boot 也是使用了 SLF4J+logback 的日志框架组合,查看 Spring Boot 项目的 Maven 依赖关系可以看到 Spring Boot 的核心启动器 `spring-boot-starter` 引入了 `spring-boot-starter-logging`. ~~~ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>2.1.1.RELEASE</version> <scope>compile</scope> </dependency> ~~~ 而 spring-boot-starter-logging 的 Maven 依赖主要引入了 logback-classic (包含了日志框架 Logback 的实现),log4j-to-slf4j (在 log4j 日志框架作者开发此框架的时候还没有想到使用日志抽象层进行开发,因此出现了 log4j 向 slf4j 转换的工具),jul-to-slf4j ( Java 自带的日志框架转换为 slf4j). ~~~ <dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.11.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> </dependencies> ~~~ # 自定义日志输出 可以直接在配置文件编写日志相关配置。 ~~~ # 日志配置 # 指定具体包的日志级别 logging.level.net.codingme=debug # 控制台和日志文件输出格式 logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n # 日志文件大小 logging.file.max-size=10MB # 保留的日志时间 logging.file.max-history=10 # 日志输出路径,默认文件spring.log logging.path=systemlog #logging.file=log.log ~~~ # 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生效 默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO # 自定义日志配置 根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载: * Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy * Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml * Log4j2:log4j2-spring.xml, log4j2.xml * JDK (Java Util Logging):logging.properties `Spring Boot`官方推荐优先使用带有`-spring`的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项(下面会提到)。 默认的命名规则,并且放在 src/main/resources 下面即可 如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,application.yml可以通过logging.config属性指定自定义的名字: ~~~ logging.config=classpath:logging-config.xml ~~~ 虽然一般并不需要改变配置文件的名字,但是如果你想针对不同运行时Profile使用不同的日志配置,这个功能会很有用。 一般不需要这个属性,而是直接在logback-spring.xml中使用springProfile配置,不需要logging.config指定不同环境使用不同配置文件。