Springboot2 集成log4j2

在任何定制系统开发过程中,健全的日志系统是调试、运维、追查故障的重要保障,因为log4j频频爆出漏洞,魁鲸科技目前主要使用log4j2这个组件替代

基础步骤

  • Spring Boot默认使用的是logback框架,因此需要排除spring-boot-starter-logging
  • 然后引入log4j2框架
  • 配置文件设置使用log4j2的配置路径
  • 程序代码种使用日志门面slf4j框架打印日志。

修改pom.xml文件

在spring-boot-starter-web种排除默认的logging包

<!-- springboot dependencies -->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
              <version>${spring-boot-starter.version}</version>
              <exclusions>
                  <exclusion>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-logging</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>

通过依赖树排除第三方的框架内对logback等冲突包的依赖
Springboot2 集成log4j2

Springboot2 集成log4j2

找到并排除

Springboot2 集成log4j2

在resource目录下新增log4j2的配置文件

<?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--> <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">  <!-- 配置日志文件输出目录,此配置将日志输出到tomcat根目录下的指定文件夹 -->
    <properties>
        <property name="LOG_HOME">./WebAppLogs/logs</property>
    </properties>
    <!--先定义所有的appender-->
    <appenders>    <!-- 优先级从高到低分别是 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL -->
        <!-- 单词解释: Match:匹配 DENY:拒绝 Mismatch:不匹配 ACCEPT:接受 -->
        <!-- DENY,日志将立即被抛弃不再经过其他过滤器; NEUTRAL,有序列表里的下个过滤器过接着处理日志; ACCEPT,日志会被立即处理,不再经过剩余过滤器。 -->
        <!--输出日志的格式     %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间     %p : 日志输出格式     %c : logger的名称     %m : 日志内容,即 logger.info("message")     %n : 换行符     %C : Java类名     %L : 日志输出所在行数     %M : 日志输出所在方法名     hostName : 本地机器名     hostAddress : 本地ip地址 -->
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">      <!--输出日志的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{1.} - %m%n"/>
            <!--<PatternLayout pattern="[%d{HH:mm:ss:SSS}] - (%F:%l) - %m%n"/>-->
            <!--<PatternLayout pattern="[%d{HH:mm:ss:SSS}] (%F:%L) %m%n" />-->
        </console>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <!-- TRACE级别日志 ; 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内, 日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出trace级别的数据到trace.log -->

        <RollingFile name="RollingFileTrace" immediateFlush="true" fileName="${LOG_HOME}/trace.log"
                     filePattern="${LOG_HOME}/trace_%d{yyyy-MM-dd-HH}-%i.log.zip">
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>

            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>

            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>

                <SizeBasedTriggeringPolicy size="10 MB"/>

            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20">
                <!--这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用           另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->

                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="trace_*.zip"/>
                    <!-- 保存时间与filePattern相同即可 -->
                    <!-- 如果filePattern为:yyyy-MM-dd-HH:mm:ss, age也可以为5s,表示日志存活时间为5s -->
                    <IfLastModified age="168H"/>

                </Delete>

            </DefaultRolloverStrategy>

        </RollingFile>

        <RollingFile name="RollingFileDebug" immediateFlush="true" fileName="${LOG_HOME}/debug.log"
                     filePattern="${LOG_HOME}/debug_%d{yyyy-MM-dd-HH}-%i.log.zip">
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>

            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>

            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>

                <SizeBasedTriggeringPolicy size="10 MB"/>

            </Policies>

            <DefaultRolloverStrategy max="20">
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="debug_*.zip"/>

                    <IfLastModified age="168H"/>

                </Delete>

            </DefaultRolloverStrategy>

        </RollingFile>     <!-- info日志配置 -->
        <RollingFile name="RollingFileInfo" immediateFlush="true"
                     fileName="${LOG_HOME}/info.log"
                     filePattern="${LOG_HOME}/info_%d{yyyy-MM-dd-HH}-%i.log.zip">       <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter
                    level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout
                    pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>

                <SizeBasedTriggeringPolicy size="10 MB"/>

            </Policies>
            <DefaultRolloverStrategy max="20">
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="info_*.zip"/>

                    <IfLastModified age="168H"/>

                </Delete>

            </DefaultRolloverStrategy>
        </RollingFile>     <!-- warn日志配置 -->
        <RollingFile name="RollingFileWarn"
                     immediateFlush="true"
                     fileName="${LOG_HOME}/warn.log" filePattern="${LOG_HOME}/warn_%d{yyyy-MM-dd-HH}-%i.log.zip">
            <ThresholdFilter
                    level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout
                    pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>

                <SizeBasedTriggeringPolicy size="10 MB"/>

            </Policies>
            <DefaultRolloverStrategy max="20">
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="warn_*.zip"/>

                    <IfLastModified age="168H"/>

                </Delete>

            </DefaultRolloverStrategy>
        </RollingFile>     <!-- error日志配置 -->
        <RollingFile
                name="RollingFileError" immediateFlush="true"
                fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error_%d{yyyy-MM-dd-HH}-%i.log.zip">
            <ThresholdFilter
                    level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout
                    pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>

                <SizeBasedTriggeringPolicy size="10 MB"/>

            </Policies>
            <DefaultRolloverStrategy max="20">
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="error_*.zip"/>

                    <IfLastModified age="168H"/>

                </Delete>

            </DefaultRolloverStrategy>
        </RollingFile>
    </appenders>   <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"/>

        <logger name="org.mybatis" level="INFO"/>

        <root level="all">
            <appender-ref ref="Console"/>

            <appender-ref ref="RollingFileDebug"/>

            <appender-ref ref="RollingFileTrace"/>

            <appender-ref ref="RollingFileInfo"/>

            <appender-ref ref="RollingFileWarn"/>

            <appender-ref ref="RollingFileError"/>

        </root>

    </loggers>
</configuration>

配置application.yml

server:
  port: 8080
spring:
  banner:
    charset: utf-8
logging:
  level:
    # 根据不同的类设定不同级别
    root: info
    study.*: debug
    nobyte.*: debug
  config: classpath:log4j2-spring.xml

 

使用slf4j打印

package study.springboot.ioc;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

/**
 * CustomService
 *
 * @author linkanyway
 * @version 1.0
 * @date 2022/04/06 20:37
 */
@Component("CustomService")
@Slf4j
public class CustomServiceImpl implements CustomService {

    /**
     * 构造器
     */
    public CustomServiceImpl() {
        log.debug ("CustomService被实例化,容器装配制定了Lazy因此容器装载时候不会立刻初始化,只有第一次调用才会初始化");
    }

    /**
     * 重载print方法
     */
    @Override
    public void print() {
    log.debug (this.getClass ().getCanonicalName ()+" 被调用了print方法");
    }
}

 

相关新闻

  • 告别“挂错号、排长队”:互联网医院产品升级,一站式AI智能分诊系统解决方案

    告别“挂错号、排长队”:互联网医院产品升级,一站式AI智能分诊系统解决方案

    在“互联网+医疗健康”政策持续利好与患者线上就医习惯养成的双重驱动下,互联网医院已成为公立医院与民营医疗机构的标配。然而,随着线上问诊量的指数级增长,一个顽疾逐渐浮出水面——分诊不精准。 患者描述“我肚子疼”,究竟是该挂消化内科、肝胆外科还是妇产科?传统的关键词匹配分诊模式显得力不从心。这不仅导致患者被反复转诊、体验感下降,更造成医疗资源的严重错配。 在此背景下,互联网医院产品正经历从“在线挂号工具”向“智慧医疗助手”的跃迁。而这一跃迁的核心引擎,正是魁鲸科技一站式AI智能分诊系统。 01 互联…

    新闻中心 2026-06-25
  • 如何做好企业管理软件的软件开发?

    如何做好企业管理软件的软件开发?

    在当前数字化时代,企业对于信息化的需求越来越强烈。围绕着管理流程、财务、人力资源等方面,许多企业开始采用企业管理软件,以提升运营效率,实现数据互通,优化管理流程。 那么,在开发企业管理软件时,如何做好软件开发呢?以下是一些关键步骤: 第一步,明确需求。在企业管理软件开发之前,首先要明确需求,制定功能清单。这样可以缩小软件开发范围,更容易实施迭代式开发,最终使得软件满足用户需求。 第二步,确定技术架构。确定合适的技术架构可以帮助企业管理软件进行模块化开发,同时也可以进行不同层次上的质量保证工作,降…

    新闻中心 2024-02-27
  • CRM销售管理系统开发

    CRM销售管理系统开发

    营销和销售是企业最重要的业务之一。现代销售管理系统不仅可以提供大量的销售管理功能和数据分析功能,还可以提高销售团队的合作和产品的准确性。 一、销售管理系统基本功能模块 1、客户关系管理CRM CRM模块是销售管理系统的核心组成部分,主要用于包括客户访问、关系维护和客户服务在内的客户交互和数据的管理和分析。通过整合客户数据,实现了销售过程的自动化和标准化,提高了销售团队的工作效率。 2、订单管理 订单管理模块负责管理和跟踪客户订单的整个生命周期,包括订单输入、跟踪、处理和结算功能。这使得销售人员能…

    新闻中心 2024-10-15
  • 三分钟搞懂仓库管理系统,手把手教你简单3步管控库存

    三分钟搞懂仓库管理系统,手把手教你简单3步管控库存

    其实仓库管理系统基本的功能就是帮我们管理库存,记录商品进出库,系统自动统计,避免人工手动统计产生的错误率,提升企业的仓库管理效率。那么今天就通过简单的比喻给你讲清仓库管理系统。   仓库管理系统 想象一下您的仓库突然变得”聪明”起来——它能自动记住每件货的位置,快到期的商品会主动亮红灯提醒,甚至连搬运工的行走路线都能自动规划。这就是我们为商家量身打造的智能仓储管理系统。 简单来说,这套系统就像一个超级管家,帮您把仓库管得明明白白: 从大仓库到小货架,都能分门别类…

    新闻中心 2025-05-09
  • 上海APP制作开发公司怎么选?十大排行榜推荐!

    上海APP制作开发公司怎么选?十大排行榜推荐!

    在移动互联网时代,APP是企业数字化转型的标配。作为中国经济中心的上海,汇聚了数千家APP开发公司,但“报价混乱、技术参差不齐、售后烂尾”是行业常态。 很多客户一上来就问:“上海APP开发公司十大排行榜有哪些?”其实,所谓的“十大排名”多为营销噱头。真正的选对公司,不能只看名气,更要看“技术匹配度”与“行业案例”。 本文不仅为您揭晓上海地区综合实力靠前的APP制作公司,更附上《APP开发避坑指南》,助您找到最契合的合作伙伴。 一、 上海APP开发公司怎么选?4个核心标准 在参考排名前,请先掌握这…

    新闻中心 2026-06-04
  • CRM客户管理系统-上海魁鲸科技

    CRM客户管理系统-上海魁鲸科技

    随着企业的长期发展和经济环境变化多端,企业会遇到长期无法突破规模化增长的瓶颈,市场竞争情况不透明、不了解,老客户运营效率难提高等企业管理难题,面对此情,魁鲸开发出CRM客户管理系统,赋能企业实现一体化数字化转型。具体功能模块如下: 1、客户信息管理 客户信息:记录客户有关信息(如名字、联系方式、公司名称、职位等)。 客户分类:根据客户属性(如行业、规模、地区)进行分类管理。 客户标签:为客户添加标签(如潜在客户、重要客户、流失客户),便于快速筛选和分析。 2、销售管理 销售线索管理:记录和管理潜…

    新闻中心 2025-03-20
  • 合规必看!ERP批次追溯让召回时间从1个月缩到1小时

    合规必看!ERP批次追溯让召回时间从1个月缩到1小时

    当危机来临时,你的追溯体系能撑多久? 在产品安全问题频发的今天,产品召回已成为企业不得不面对的现实问题。一旦出现质量安全事故,快速、精准的召回能力,不仅关系到消费者健康,更直接影响企业的生死存亡。 一个残酷的现实是: 传统的手工追溯方式,平均需要1个月才能完成完整的批次追溯。而当你的团队还在翻阅纸质记录、查询Excel表格时,问题产品可能已经流向了千家万户…… 01 召回为什么总那么慢?三个致命断点 1)先看一个真实场景: 某食品企业收到客户投诉——某批饮料出现异物。质量部开始倒查: 第1周:翻…

    新闻中心 2026-04-29
  • 一体化企业微信办公平台开发

    一体化企业微信办公平台开发

    企业微信凭借与微信互通的独特优势,已成为连接公司内部控制管理和外部营销的重要桥梁。其天然具备的用户基础、便捷的使用体验和丰富的API接口,为二次开发提供了无限可能。如今,企业微信已成为很多企业数字化转型的首选平台。如何根据企业微信创建高效的综合办公平台正成为企业关心的热门话题。 一、一体化企业微信办公平台的核心功能模块 1、智能考勤管理系统 通过整合地理位置、Wi-Fi识别和人脸识别技术,实现精准的考勤记录。管理人员可随时查看团队出勤情况,系统自动生成考勤报表。 2、智能审批流程 依据企业组织结…

    新闻中心 2025-09-05
  • 仓库管理WMS系统适合哪些企业?WMS有哪些优势?

    仓库管理WMS系统适合哪些企业?WMS有哪些优势?

    WMS仓库管理系统(全称为Warehouse Management System) ,是通过出入库业务、仓库调拨、库存调拨和虚拟仓库管理等功能,对企业货物的批次进行管理、对物料和BOM进行管理,帮助企业对质检进行管控、实时计算即时库存等功能综合运用的管理系统。 一、wms优势 WMS的主要优势之一是能够让企业管理者实时了解库存状况和库存位置。通过WMS系统可以实时监控企业库存状况、订单的状态,为仓库管理运营提供实时数据支撑,使企业能够更快的做出精准的决策同时能响应更多的变化。WMS系统中的库存周…

    FAQ 2025-05-06
  • ERP系统定制开发的优势有哪些

    ERP系统定制开发的优势有哪些

    在当今的商业环境下,企业资源计划或ERP系统已成为组织运营的核心。这些软件解决方案使企业能够更有效地管理和整合供应链管理、财务管理、人力资源和客户关系管理等各部门的功能。尽管市场上有许多现成的ERP解决方案,但越来越多的企业正在转向定制开发他们的ERP系统,以满足他们独特的业务需求。 您的企业是否正在面临这样的问题? 利润难以核算清 货物缺管导致损失 人员、系统数据缺乏协同 无法精准决策难 为什么要选择ERP系统定制开发? 1、增强业务适应性和灵活性 定制开发的ERP系统可以根据企业的具体业务流…

    新闻中心 2024-08-09
在线咨询
客服微信
客服微信
获取方案/报价
联系我们

联系我们

400-103-7662

售前咨询邮箱:
sales@king-v.com

工作时间:
法定工作日 9:00-18:00

返回顶部