springboot的日志框架
Spring Boot 默认选择了 SLF4J 结合 LogBack。
在 Spring Boot 的 Maven 依赖里可以清楚的看到 Spring Boot 排除了其他日志框架。
其实 Spring Boot 也是使用了 SLF4J+logback 的日志框架组合,查看 Spring Boot 项目的 Maven 依赖关系可以看到 Spring Boot 的核心启动器 spring-boot-starter 引入了 spring-boot-starter-logging.
1 2 3 4 5 6
| <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 ,log4j-to-slf4j ,jul-to-slf4j .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <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>
|
demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @SpringBootTest @RunWith(SpringRunner.class) public class LogbackTest {
Logger logger = LoggerFactory.getLogger(getClass());
@Test public void testLog() { logger.trace("Trace 日志..."); logger.debug("Debug 日志..."); logger.info("Info 日志..."); logger.warn("Warn 日志..."); logger.error("Error 日志..."); } }
|
已知日志级别从小到大为 trace < debug < info < warn < error . 运行得到输出如下。由此可见 Spring Boot 默认日志级别为 INFO.
1 2 3
| 2020-05-14 13:28:11.340 INFO 7180 --- [ main] com.qn.test.LogbackTest : Info 日志... 2020-05-14 13:28:11.340 WARN 7180 --- [ main] com.qn.test.LogbackTest : Warn 日志... 2020-05-14 13:28:11.340 ERROR 7180 --- [ main] com.qn.test.LogbackTest : Error 日志...
|
结合日志来看,默认的日志格式为:
1 2 3 4 5 6
| %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
|
自定义日志输出
properties:
1 2 3 4 5 6
| logging.file.path=log logging.file.max-history=10 logging.file.max-size=10MB logging.level.com.qn=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
|
yml:
1 2 3 4 5 6 7 8 9 10 11
| logging: file: path: log max-history: 10 max-size: 10MB level: com: qn : debug pattern: console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n' file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n'
|
使用配置文件
1 2
| logging: config: classpath:logging-config.xml
|
log4j
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency>
|
log4j2.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| Configuration: status: warn Properties: # 定义全局变量 Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
- name: log.level.console value: trace - name: log.level.xjj value: trace - name: log.path value: /opt/logs - name: project.name value: my-spring-boot Appenders: Console: #输出到控制台 name: CONSOLE target: SYSTEM_OUT ThresholdFilter: level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值 onMatch: ACCEPT onMismatch: DENY PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" RollingFile: # 输出到文件,超过128MB归档 - name: ROLLING_FILE ignoreExceptions: false fileName: ${log.path}/${project.name}.log filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz" PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" Policies: SizeBasedTriggeringPolicy: size: "128 MB" DefaultRolloverStrategy: max: 1000 Loggers: Root: level: info AppenderRef: - ref: CONSOLE - ref: ROLLING_FILE Logger: # 为com.xjj包配置特殊的Log级别,方便调试 - name: com.xjj additivity: false level: ${sys:log.level.xjj} AppenderRef: - ref: CONSOLE - ref: ROLLING_FILE
|
logback的优势
- 更快的执行速度:logback重写了内部实现,在某些特定的场景下,甚至比之前快了10倍。在保证logback组件更快速的同时所需内存更小。
- 与SLF4J组合使用。
- 自动刷新配置文件:这个过程很快,无需资源竞争,不会创建一个单独的线程去扫描。
- 优雅的从I/O错误中恢复,文件服务器宕机,无需重新启动。
- 过滤:可以设置特定用户日志级别。
- logback原生支持同时按日期和文件大小分割。