Spring Boot + Log4j2 日志框架配置 (Maven)

参考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 [email protected]
 * @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的使用.

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

原文地址:http://blog.51cto.com/11931236/2058708

时间: 2024-07-31 00:25:02

Spring Boot + Log4j2 日志框架配置 (Maven)的相关文章

【spring boot】8.spring boot的日志框架使用

在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. ============================================================================================= 简介:spring boot的默认日志框架Logback SLF4J--Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象.Java日志框架众多--常用的有

Spring Boot 之日志记录

Spring Boot 之日志记录 Spring Boot 支持集成 Java 世界主流的日志库. 如果对于 Java 日志库不熟悉,可以参考:细说 Java 主流日志工具库 关键词: log4j, log4j2, logback, slf4j 日志格式 控制台输出 彩色打印 文件输出 日志级别 日志组 日志配置文件 Spring Boot 中的日志配置 源码 引申和引用 Spring Boot 内部日志全部使用 Commons Logging 记录,但保留底层日志实现.为 Java Util

Spring Boot系列——日志配置

日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要的地位. 为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以生产环境一旦出现问题,预警系统就会通过邮件.短信甚至电话的方式实施多维轰炸模式,确保相关负责人不错过每一个可能的bug. 预警系统判断疑似bug大部分源于日志.比如某个微服务接口由于各种原因导致频繁调用出错,此时调用端会捕获这样的异常并打印ERROR级别的日志,当该错误日志达到一定次数出现的时候,就会

Spring Boot 探索系列 - 自动化配置篇

26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging,Log4J, Log4J2 an

Spring Boot Log 日志使用教程

我们编写任何 Spring Boot 程序,可能绕不开的就是 log 日志框架(组件). 在大多数程序员眼中日志是用来定位问题的.这很重要. 本项目源码下载 注意本项目提供的源码已在后期重新编写,有部分日期描述不一致. 如果你只是想知道 Spring boot log 如何使用,请直接观看 3.2 使用 Spring Boot Logback 1 Log 日志概述 1.1 Log 日志组件能干什么 日志能干的事情很多,对于学习程序,测试的工程师来说,日志能够定位问题,解决问题,是最大的功能点.

Spring集成Log4j日志框架

1.日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的日志接口,而log4j是具体实现了的日志框架. slf4j与常用日志框架绑定关系,图片来源 2.Maven导入slf4j和log4j,编辑pom.xml <!-- 导入slf4j-log4j12,依赖slf4j-api和log4j,自动导入 --> <dependency> <gro

Spring Boot log4j2 configuration example

spring boot 默认log用的是 LogBack. 1. Log4j2 Maven Dependency pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> </paren

spring boot slf4j日记记录配置详解

转 spring boot slf4j日记记录配置详解 2017年12月26日 12:03:34 阅读数:1219 Spring-Boot--日志操作[全局异常捕获消息处理?日志控制台输出+日志文件记录] 最好的演示说明,不是上来就贴配置文件和代码,而是,先来一波配置文件的注释,再来一波代码的测试过程,最后再出个技术在项目中的应用效果,这样的循序渐进的方式,才会让读者更加清楚的理解一项技术是如何运用在项目中的,虽然本篇很简单,几乎不用手写什么代码,但是,比起网上其他人写的同类型的文章来说,我只能

Laravel 和 Spring Boot 两个框架比较创业篇(二:人工成本)

前面从开发效率比较了 Laravel 和 Spring Boot两个框架,见:Laravel 和 Spring Boot 两个框架比较创业篇(一:开发效率) ,这一篇打算比较一下人工成本. 本文说的人工成本是狭义的技术支出成本.当然人工成本不单纯是开发人员的人工成本,同时包含了团队协作管理.架构设计.运维等方面的人工(团队)成本. 本文从以下几个维度分析: 程序员 技术管理 程序员 相信这个是大家比较关注的维度,很好理解,就是要根据需求撸一套产品出来,无论是后端.前端.APP还是小程序.中台,都