Spring Boot 自定义日志详解

Spring Boot 日志综合介绍

Spring Boot 内部代码使用的是 commons-logging 来记录日志的,但是底层日志实现框架是可以随意替换的。Spring Boot为 Java Util Logging, Log4J2, 和 Logback 日志框架提供了默认配置。

Spring Boot支持的日志框架默认配置如下。

# LOGGING
logging.config= # Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback.
logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
logging.file= # Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.
logging.file.max-history=0 # Maximum of archive log files to keep. Only supported with the default logback setup.
logging.file.max-size=10MB # Maximum log file size. Only supported with the default logback setup.
logging.level.*= # Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`.
logging.path= # Location of the log file. For instance, `/var/log`.
logging.pattern.console= # Appender pattern for output to the console. Supported only with the default Logback setup.
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS # Appender pattern for log date format. Supported only with the default Logback setup.
logging.pattern.file= # Appender pattern for output to a file. Supported only with the default Logback setup.
logging.pattern.level=%5p # Appender pattern for log level. Supported only with the default Logback setup.
logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.

如果不配置以上任何参数,日志默认只会以 INFO 以上的级别打印在控制台,不会记录在日志文件中。

如果使用了任何 Starters,那 Spring Boot 默认会使用 Logback 日志框架记录日志,并为 Logback 提供了支持Java Util Logging, Commons Logging, Log4J, SLF4J 适合的桥接器以便能从这些日志门面中自由切换。即项目中不管使用哪个日志门面,Logback都能正常工作。

如下图,从 spring-boot-starter-web 依赖树中看出包含了默认日志框架 Logback 及其他的桥接器。

Spring Boot 日志实战

在配置文件 application.properties 添加以下配置。

# 日志级别
logging.level.root=DEBUG

# 输出到日志文件
logging.file=d:/logs/javastack.log

# 控制框架中的日志级别
logging.level.org.springframework=INFO
logging.level.sun=WARN

Application 启动类中添加以下测试代码。

private static final org.apache.commons.logging.Log logger1 = org.apache.commons.logging
            .LogFactory
            .getLog(SpringBootBestPracticeApplication.class);

private static final org.slf4j.Logger logger2 = org.slf4j.LoggerFactory
        .getLogger(SpringBootBestPracticeApplication.class);

private static final java.util.logging.Logger logger3 = java.util.logging.Logger
        .getLogger("SpringBootBestPracticeApplication");

@Bean
public CommandLineRunner loggerLineRunner() {
    return (args) -> {
        logger1.error("commons logging error...");

        logger1.info("commons logging info...");
        logger2.info("slf4j info...");
        logger2.info("java util logging info...");

        logger1.debug("commons logging debug...");
    };
}        

日志输出如下。

2018-05-24 17:16:21.645 ERROR 3132 --- [           main] c.j.s.SpringBootBestPracticeApplication  : commons logging error...
2018-05-24 17:16:21.645  INFO 3132 --- [           main] c.j.s.SpringBootBestPracticeApplication  : commons logging info...
2018-05-24 17:16:21.645  INFO 3132 --- [           main] c.j.s.SpringBootBestPracticeApplication  : slf4j info...
2018-05-24 17:16:21.645  INFO 3132 --- [           main] c.j.s.SpringBootBestPracticeApplication  : java util logging info...
2018-05-24 17:16:21.645 DEBUG 3132 --- [           main] c.j.s.SpringBootBestPracticeApplication  : commons logging debug...

程序中使用了三种不同的日志门面测试,和默认的 Logback 框架工作都十分正常,日志也正常输出到指定文件中了。

Spring Boot 默认提供配置的形式非常简单,只适合简单的日志应用,虽然说日志输出格式可以自定义,但日志文件如何按天滚动等其他更复杂的策略却不能配置,只能通过自定义引用日志文件的形式。

Spring Boot 定制日志文件

简单的日志配置不能满足实际项目需求,那可以通过引用定制日志文件的形式达到目的。Spring Boot能根据类路径下的类库和配置文件自动配置对应的日志框架。

日志框架

配置文件

Logback

logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy

Log4j2

log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)

logging.properties

按对应类库在 classpath 下创建对应支持的日志配置文件就行,或者通过配置 logging.config 指定。

既然默认是支持 Logback 的,那现在只要在资源根目录下创建一个 logback-spring.xml 文件即可。xx-spring 这是 Spring Boot 推荐的命名方式,否则 Spring Boot 不能完全控制日志初始化,因为默认命名配置文件 logback.xml 加载较早不能获取到 application.properties 中的配置信息。

看到这里,相信你对 Spring Boot 的日志应该有了一个全面的了解。如何使用配置文件打印日志和传统项目一样,这里就不啰嗦了。

所有 Spring Boot 文章示例代码都在 Github 上面,大家可以 Star 关注一下。

https://github.com/javastacks/spring-boot-best-practice

原文发布于微信公众号 - Java技术栈(javastack)

原文发表时间:2018-11-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏EAWorld

详解Spring Boot 自动配置机制

一、简介 Spring boot 是一个基于 Spring框架开发,高于 Spring 框架,它对 Spring 做了更好的封装,提供了更多的产品级特性,极大的...

3556
来自专栏编程

Spring-Data-REST轻松搞定RESTfulAPI

背景 昨天同事问我有没有研究过 ,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 ,过一会发过两个截图过来。真的很强大,感觉这个在使用...

2726
来自专栏阿杜的世界

Spring Boot的自动配置、Command-line Runner

接下来关于SpringBoot的一系列文章和例子,都来自《Spring Boot Cookbook》这本书,本文的主要内容是start.spring.io的使用...

892
来自专栏玩转JavaEE

初识Spring Boot框架

按:最近公众号文章主要是整理一些老文章,主要是个人CSDN上的博客,也会穿插一些新的技术点。 ---- 前面的铺垫文章已经连着写了六篇了,主要是介绍了Sprin...

3855
来自专栏开发与安全

linux网络编程之进程间通信基础(一):进程间通信概述

一、顺序程序与并发程序特征 顺序程序特征 顺序性 封闭性:(运行环境的封闭性) 确定性 可再现性 并发程序特征 共享性 并发性 随机性 二、进程互斥 ...

1800
来自专栏一个会写诗的程序员的博客

《Spring Boot 实战:从0到1》第3章 零XML配置的Spring Boot Application第3章 零XML配置的Spring Boot

Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性properties文件、YAML 文件、环境变量和命令行参数来定义优先级不同...

1634
来自专栏Gaussic

基于Spring Boot 的Blog开发 原

之前写过几篇关于利用Spring MVC来开发的博客,从博客下面的评论以及GitHub上的Issues看还是会出现许多的问题,且大部分的问题都出在配置上。虽然说...

991
来自专栏我的技术专栏

在Linux上如何查看Python3自带的帮助文档?

1373
来自专栏芋道源码1024

注册中心 Eureka 源码解析 —— 项目结构简介

本文主要基于 Eureka 1.8.X 版本 1. 概述 1.1 简介 1.2 项目结构 2. eureka-client 2.1 eureka-client-...

4678
来自专栏Linyb极客之路

Spring Boot 2.0迁移指南主要注意点

Spring官方的Spring Boot 2变动指南,主要是帮助您将应用程序迁移到Spring Boot 2.0,变化部分还是很多很细节的,摘录主要点如下: S...

964

扫码关注云+社区

领取腾讯云代金券