SpringBoot+log4j2实现标准日志记录

前言

此篇文章基于xml文件形式进行整合,后续会另推出以boot/cloud为微服务架构下基于log4j2整合

说到log4j2肯定会有log4j,log4j2就是log4j的替代者,log4j目前已经停止更新,微服务架构下日志首选为ELK,然而ELK略耗资源,由此很多企业都采用logBack或者log4j2+slf4j,

核心依赖添加

SpringBoot默认携带自身的log日志功能,需要去调默认配置方能生效

 <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> <!-- 引入log4j2依赖 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

log4j2核心配置(基于xml形式)

log4j2-spring.xml核心配置标签概述以及描述都有写

<?xml version="1.0" encoding="UTF-8" ?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration  monitorInterval="5">
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--变量配置-->
    <Properties>
        <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
        <!-- %logger{36} 表示 Logger 名字最长36个字符
        %date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %l - %msg%n
        -->
        <property name="LOG_PATTERN" value="%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %l -%M - %msg%n"/>
        <!-- 定义日志存储的路径 -->
        <property name="FILE_PATH" value="D:\logs"/>
    </Properties>

    <appenders>
        <!--控制台日志输出-->
        <console name="Console" target="SYSTEM_OUT">
            <!--运行日志输入文件-->
            <!--<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--日志的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <!--控制台输出日志格式-->
            <!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
        </console>
        <AsyncRoot level="info" includeLocation="true">
            <AppenderRef ref="Console"/>
            <appender-ref ref="infoJournal"/>
            <appender-ref ref="debugJournal"/>
        </AsyncRoot>
        <!--
        debug 运行时异常日志信息
        -->
        <RollingFile name="debugJournal" fileName="${FILE_PATH}/堆栈日志.log"
                     filePattern="D://logs/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
            <!--文件只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--日志消息输出格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--日志拆分规则-->
            <Policies>
                <!--在系统启动时,生成一个新的日志文件-->
                <OnStartupTriggeringPolicy/>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="0.001"/>
                <SizeBasedTriggeringPolicy size="10 Kb"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下10个文件开始覆盖-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
        <RollingFile name="infoJournal" fileName="${FILE_PATH}/运行日志.log"
                     filePattern="D://logs/$${date:yyyy-MM-dd}/run-%d{yyyy-MM-dd}-%i.log">
            <!--文件只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--日志消息输出格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--日志拆分规则-->
            <Policies>
                <!--在系统启动时,生成一个新的日志文件-->
                <OnStartupTriggeringPolicy/>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="0.001"/>
                <SizeBasedTriggeringPolicy size="10 KB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下10个文件开始覆盖-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
    </appenders>

    <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
    <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>

        <!--过滤掉spring和mybatis的一些无用的信息-->
        <logger name="org.mybatis" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </logger>
        <!--监控系统信息-->
        <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="infoJournal"/>
            <appender-ref ref="debugJournal"/>
        </root>
    </loggers>
</configuration>

引用log4j2日志规则文件

SpringBoot下有yml简化写法和properties全名写法
我用的是yml,由此是下面这种格式,你们用时直接修改配置文件为application.yml为后缀即可

logging:
  config: classpath:log4j2-spring.xml

controller层引用log4j2

这里简单描述一下当前测试场景,根据我的配置文件loh4j2-spring.xml日志规则,我这里只记录两种级别,一个为运行日志(包含错误信息,程序运行过程),一个为访问日志(只记录运行信息)

package com.itxwl.run.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Auther: 薛
 * @Date: 2020/4/30 15:37
 * @Description:
 */
@RestController
@RequestMapping("t")
public class DemoController {
    private Logger logger= LogManager.getLogger(DemoController.class);
    @GetMapping("/s/{data}")
    public Integer  s(@PathVariable("data") Integer data){
        logger.fatal("访问运算接口~");
        Integer dd=5;
        Integer ix=0;
        if (!StringUtils.isEmpty(data)){
            try {
                ix = dd / data;
            } catch (Exception e) {
                logger.error("运算失败,可能被除数为零");
            }
        }
        return ix;
    }
}

服务运行后场景概况

根据以上log4j2配置文件规则会在系统D盘/logs文件下生成日志文件

  • 首次系统运行即生成两个文件
    在这里插入图片描述
  • 日志测试环境限定配置为满10KB即滚动当前日志文件,异常及堆栈信息移动其它文件

  • 日志文件满足10KB时会自动新增,根据xml文件配置如果满30个文件,会回滚为最后一条为最新数据

在这里插入图片描述

服务结构图(基于idea)

在这里插入图片描述

日志记录文件图示

  1. 运行日志如图

  2. 访问日志如图
    在这里插入图片描述

结束语(博主联系方式)

当然只是基础引用log4j2记录日志,后续会持续推出日志相关文章,进而整合到微服务架构下日志记录。

QQ:2509647976
微信:x331191249

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章