参考Spring Boot官方文档 日志部分

Spring Boot默认情况下,当使用"Starters" 使用Logback输出日志 , 还包括适当的Logback路由, 确保其他的日志框架(Java Util Logging, Commons Logging, Log4j, SLF4J)都能正常使用

Sping Boot文档的 26.5 Custom Log Configuration 章节,说明了自定义日志配置方法

多样的日志系统可以通过

  1. 添加适当的日志框架库到classpath
  2. 适当的配置配置文件加入到classpath的根目录 或者 其他的本地目录, 使用Spring配置 loggin.config 配置指定配置文件

依赖于开发者选择的日志框架. 这些对应的配置文件会被加载

日志框架 配置文件
Logback logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j2 log4j2-spring.xml, log4j2.xml
JDK(JAVA Util Logging) logging.properties

引入Log4j2日志框架

Log4j2为何物就不介绍了. Log4j2官网

配置的方案 在官方文档 77.2 Configure Log4j for Logging

1. Maven依赖配置

pom.xml中去掉Logback, 引入log4j2

<!-- 节选 -->
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

2. 配置文件

2.1 log4j2.xml

使用xml格式配置文件, 无需添加额外的依赖库.

2.2 log4j2.yaml / log4j2.yml

使用 yaml/yml格式配置文件. 需要额外引入依赖库

<!-- 解析yml配置 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

2.3 log4j2.json

使用 json 格式配置文件, 需要额外引入依赖库

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

3. 修改spring boot配置

指定spring boot配置文件

application.yaml文件配置如下

logging:
  config: classpath:log4j2.xml

Log4j2日志配置

如需了解Log4j2详尽的配置, 可访问官方文档

概述

大概介绍一下Log4j2的基本信息

日志的Level分为:

  1. trace (追踪)
  2. debug (调试)
  3. info (信息)
  4. warn (警告)
  5. error (错误)
  6. fatal (严重错误)

这里介绍一下博主经常使用的一种日志方式 RollingFileAppender

以一个具体的配置为例

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="trace" strict="true" name="LogConfig">
    <Properties>
        <Property name="filepath">/tmp/log4j2</Property>
    </Properties>
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
            </PatternLayout>
        </Console>
        <RollingFile name="logService"
                     fileName="${filepath}/logService.log"
                     filePattern="${filepath}/bak/logService-%d{yy-MM-dd HH:mm:ss}.log.gz">
            <PatternLayout>
                <Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
            </PatternLayout>
            <Policies>
                <CronTriggeringPolicy schedule="1 * * * * ?" evaluateOnStartup="true"/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="fileLogger" level="debug" additivity="false">
            <AppenderRef ref="logService"/>
            <AppenderRef ref="STDOUT"/>
        </Logger>

        <Root level="trace">
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>

</Configuration>

1. Configuration 参数

  1. status: Level枚举型, 控制输出Log4j事件信息, 默认 error
  2. name: 配置名称
  3. strict: 是否使用严格的XML格式. 推荐使用, 规范开发者的配置编写, 不支持jsonp配置
  4. ... 其他几个配置可以参考官方文档

2. Properties

设置配置文件全局的参数变量. 用于减少自定义配置信息的重复编码.

<Properties>
    <Property name="filepath">/tmp/log4j2</Property>
</Properties>

配置下文中, 可以使用 ${filepath} 来代替 /tmp/log4j2

3. Appenders

Log4j2提供了丰富的Appender

  1. AsyncAppender 设置appender异步方式输出日志
  2. CassandraAppender 输出至Cassandra存储
  3. ConsoleAppender 输出控制台
  4. FailoverAppender 设置appender错误重试
  5. FileAppender 输出至文件
  6. FlumeAppender 输出至Flume
  7. JDBCAppender 输出至JDBC连接的关系型数据库表
  8. JMS Appender 输出至消息服务
  9. JPAAppender 输出至使用JPA连接的关系行数据库
  10. HttpAppender 输出至Http Service
  11. KafkaAppender 输出至Kafka
  12. MemoryMappedFileAppender 输出至内存
  13. NoSQLAppender 输出至NoSQL数据库
  14. OutputStreamAppender File/Socket类型的Appender
  15. RandomAccessFileAppender 性能是FileAppder的0.2-2倍
  16. RollingFileAppender 输出至文件, 文件能按照规则打包文件
  17. RollingRandomAccessFileAppender 同上
  18. SMTPAppender 邮件形式输出
  19. SocketAppender socket方式发送日志

项目中比较常用的是 ConsoleAppenderRollingFileAppender.

接下来对上述的Appender配置参数的说明

<Appenders>
    <!-- ConsoleAppender -->
    <!-- name Appender名称 -->
    <!-- target 枚举型(SYSTEM_OUT, SYSTEM_ERR). 默认 SYSTEM_OUT -->
    <Console name="STDOUT" target="SYSTEM_OUT">
        <!-- 输出格式 详细配置见下文 -->
        <PatternLayout>
            <Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
        </PatternLayout>
    </Console>

    <!-- RollingFileAppender -->
    <!--  fileName 输出的问题名称, 使用绝对路径确保日志位置的正确性, 并且确保目录有进程用户可写权限  -->
    <!-- filePattern 日志回滚的文件命名规则 -->
    <RollingFile name="logService"
                 fileName="${filepath}/logService.log"
                 filePattern="${filepath}/bak/logService-%d{yy-MM-dd HH:mm:ss}.log.gz">
        <PatternLayout>
            <Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
        </PatternLayout>
        <Policies>
            <!-- 按Cron定时任务回滚文件-->
            <!-- schedule Cron表达式 -->
            <!-- evaluateOnStartup  (规则: 启动时,检查判断目标文件最后的修改时间, 如果cron规则判断该文件需要回滚,则直接回滚文件.) 是否开启该规则操作 -->
            <CronTriggeringPolicy schedule="1 * * * * ?" evaluateOnStartup="true"/>
        </Policies>
    </RollingFile>
</Appenders>

3.2 日志输出规则 Layouts

Layout有多种格式输出

  1. CSV
  2. GELF
  3. HTML
  4. JSON
  5. Pattern
  6. ....

项目中一般使用Pattern 按行输出逐条信息, 配置如下:

<!-- 节选配置 -->
<PatternLayout>
    <Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
</PatternLayout>

% + char/word 代表一种输出的信息或者格式

时间 %d / %date

格式 输出
%d, %d{DEFAULT} 2012-11-02 14:34:02,781
%d{UNIX} 1351866842
%d{UNIX_MILLIS} 1351866842781
%d{yyyy-MM-dd HH:mm:ss,SSS} 2012-11-02 14:34:02,781

类 %c / %logger

输出调用的类名

%c{number} , 控制类型的长度

等级 %level

输出等级 TRACE, DEBUG, INFO, WARN, ERROR, FATAL

颜色格式 %highlight

%heighlight{xxx}

xxx将会带有颜色样式, 并且和Level相关, 一般用于debug调试信息使用

日志内容 %m / %msg / %message

可添加文本样式

换行 %n

根据操作系统的输出不同的换行标识符用户日志换行, 最好别使用 \n, \r\n 等换行符号

其他还有很多标识符号, 参考 官方文档

4. Loggers

  1. 必须包含一个 Root 元素, 不设置 Root 元素, 将会默认使用类似如下的配置
<Root level="error">
    <AppenderRef ref="Console" />
</Root>
  1. 配置其他开发者自定义的 Logger
<Loggers>
    <!-- name 必填且唯一 -->
    <!-- level 设置输出最低级别 默认error -->
    <!-- additivity 是否在父Logger输出, 默认 true -->
    <Logger name="fileLogger" level="debug" additivity="false">
        <!-- 上文中定义的Appender name -->
        <AppenderRef ref="logService"/>
        <AppenderRef ref="STDOUT"/>
    </Logger>

    <Root level="ERROR">
        <AppenderRef ref="STDOUT"/>
    </Root>
</Loggers>

使用Logger

以demo为例

package info.chiwm.log4j2.service;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 * @author chiwm@kuyumall.com
 * @ClassName: Log4j2ServiceImpl
 * @Description:
 * @date 2018/1/4 上午11:10
 */

@Service
public class Log4j2ServiceImpl implements Log4j2Service {
    // 使用LogManager获取配置Logger
    private static Logger logger = LogManager.getLogger("fileLogger");

    @Override
    public void info(String msg) {

        // 输出日志
        // 特别注意 不要使用 `+` 去拼接信息, 这样在控制输出级别之后, 有些日志操作不会打印, 但是它去操作了新字符串创建, 使用 `{}` 去代替 `+`
        logger.info("info {}", msg);
    }

    @Override
    public void error() {
        logger.error("error");
    }

    @Override
    public void warn() {
        logger.warn("warn");
    }

    @Override
    public void debug() {
        logger.debug("debug");
    }

    @Override
    public void trace() {
        logger.trace("trace");
    }
}

总结

前面的配置步骤,配置,使用步骤,大概描述了Log4j2的使用.

欢迎评论区指出错误或者探讨相关的问题