1

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

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

多样的日志系统可以通过

添加适当的日志框架库到classpath
适当的配置配置文件加入到classpath的根目录 或者 其他的本地目录, 使用Spring配置 loggin.config 配置指定配置文件
依赖于开发者选择的日志框架. 这些对应的配置文件会被加载

日志框架配置文件Logbacklogback-spring.xml,logback-spring.groovy,logback.xml,logback.groovyLog4j2log4j2-spring.xml,log4j2.xmlJDK(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>
  1. 配置文件

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>
  1. 修改spring boot配置

指定spring boot配置文件

application.yaml文件配置如下

logging:
  config: classpath:log4j2.xml

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

概述
大概介绍一下Log4j2的基本信息
日志的Level分为:

trace (追踪)
debug (调试)
info (信息)
warn (警告)
error (错误)
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 参数

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

  1. Properties

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

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

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

  1. Appenders

Log4j2提供了丰富的Appender

AsyncAppender 设置appender异步方式输出日志
CassandraAppender 输出至Cassandra存储
ConsoleAppender 输出控制台
FailoverAppender 设置appender错误重试
FileAppender 输出至文件
FlumeAppender 输出至Flume
JDBCAppender 输出至JDBC连接的关系型数据库表
JMS Appender 输出至消息服务
JPAAppender 输出至使用JPA连接的关系行数据库
HttpAppender 输出至Http Service
KafkaAppender 输出至Kafka
MemoryMappedFileAppender 输出至内存
NoSQLAppender 输出至NoSQL数据库
OutputStreamAppender File/Socket类型的Appender
RandomAccessFileAppender 性能是FileAppder的0.2-2倍
RollingFileAppender 输出至文件, 文件能按照规则打包文件
RollingRandomAccessFileAppender 同上
SMTPAppender 邮件形式输出
SocketAppender socket方式发送日志
项目中比较常用的是 ConsoleAppender 和 RollingFileAppender.

接下来对上述的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

....
项目中一般使用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, rn 等换行符号

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

  1. Loggers

必须包含一个 Root 元素, 不设置 Root 元素, 将会默认使用类似如下的配置

<Root level="error">
    <AppenderRef ref="Console" />
</Root>

配置其他开发者自定义的 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的使用.

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

更多精彩文章,关注公众号【ToBeTopJavaer】,更有如下数万元精品vip资源免费等你来拿!!!
1574903758(1).jpg

1574903796(1).jpg


TopJavaer
291 声望64 粉丝