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方法");
    }
}

 

相关新闻

  • 物联网开发:企业数字化转型升级新保障

    物联网开发:企业数字化转型升级新保障

    在数字时代,企业面临着前所未有的机遇和挑战。物联网技术以其独特的能力将物理世界与数字世界紧密联系起来,为企业提供了新的运营模式和价值创造模式。 对中小型企业而言,数字化转型不再是一种选择,而是一个与生存和发展有关的必要问题。 一、物联网技术是什么? 物联网(Internet of Things,包括硬件设计、嵌入式系统开发、网络通信、数据处理和用户界面设计在内的物联网系统开发是一个跨学科的领域。该系统允许物理设备收集和交换数据,并通过网络实现智能控制和管理。 什么是物联网的关键技术? 1、传感器…

    新闻中心 2024-10-24
  • 3D 场景漫游系统在产品销售中的应用

    3D 场景漫游系统在产品销售中的应用

    1. 引言 3D 场景漫游系统是一种先进的数字化工具,专为工业类产品的展示和制造过程可视化而设计。该系统利用最新的三维技术,允许用户以虚拟现实的方式探索工业场景、观察制造过程、进行产品换装展示,以及放大细节查看资料。它是工业领域的创新性工具,不仅提高了产品展示的沉浸感,还优化了工厂运营和产品设计的过程。 2. 系统功能 2.1 3D 场景漫游 虚拟工厂漫游:用户可以通过系统在虚拟工厂中自由漫游,仿佛置身于实际工厂现场。这使得远程参观、培训和监测变得更加容易和实际。 2.2 制造过程可视化 实时制…

    新闻中心 2023-09-18
  • 企业如何快速实施oa办公系统自动化办公?

    企业如何快速实施oa办公系统自动化办公?

    近年来,随着企业信息化的深入推进,企业更加注重运用科技手段提高工作效率,oa办公系统的应用也日益广泛。然而,如何快速实施oa办公系统自动化办公,成为了许多企业所关心的问题。下面,本文将分享企业如何快速实施oa办公系统自动化办公的一些经验和方法。 首先,快速实施oa办公系统自动化办公需要确保人员参与。oa办公系统自动化办公不是简单的软件上线,而是涉及到企业所有人员的工作流程变革。因此,企业在实施oa办公系统自动化办公时,必须充分调动人员积极性,将人员参与纳入到实施方案中,辅助人员适应新的工作模式。…

    新闻中心 2024-03-04
  • 成人教育APP开发:魁鲸科技带你揭秘千亿市场核动力

    成人教育APP开发:魁鲸科技带你揭秘千亿市场核动力

    在数字化学习浪潮下,成人教育市场正迎来爆发式增长。越来越多的企业和机构希望通过定制化教育APP提升用户体验、扩大市场份额。作为行业领先的技术服务商,魁鲸科技凭借丰富的教育类软件开发经验,成功助力多家企业从0到1打造高效、智能的成人教育平台。 一、为什么要开发成人教育APP? 在成人教育领域,用户普遍面临时间碎片化、学习动力不足、课程质量参差不齐等问题,而教育机构则面临获客成本高、完课率低、用户留存难等挑战。   痛点 用户痛点 机构痛点 ×时间碎片化,难以系统学习 ×课程同质化严重,缺…

    新闻中心 2025-06-17
  • 开发一个聊天app需要多少钱

    开发一个聊天app需要多少钱

    上周有个做海外语聊产品的创始人找我,说找了个外包团队,报价28万,四个月交付。他把需求文档发过来,我扫了一眼:跨平台、音视频、全球加速、鸿蒙适配。 我跟他说:这项目,你准备200万。 他愣了。不是团队黑心,是绝大多数人根本看不懂聊天软件的定价逻辑。我今天不绕弯子,直接把你当CTO,聊透这笔账。 一、你的聊天App属于哪一层?三个技术档位对应不同预算 2026年做IM(即时通讯),最大的坑已经不是“被宰”,而是“用20万的预算接了本需200万架构的活儿”。我把过去三年经手审核的37个项目按技术底座…

  • 飞书、企业微信、钉钉的收费对比哪个好

    飞书、企业微信、钉钉的收费对比哪个好

    在年费从零到数百万的选项背后,选择哪个协同平台,本质上是为企业挑选未来三年的数字化基座与业务增长引擎。 本文将通过一张表格直观对比三大平台的核心成本要素,但一项核心结论是:钉钉专业版以9800元的统一定价提供组织管理深度,企业微信将成本重心放在连接微信生态的增值服务上,而飞书则采用更为灵活的按席订阅模式,其高级AI功能需额外付费。 01 产品哲学与收费逻辑 在对比具体数字前,理解这三款产品的底层哲学至关重要,这直接决定了它们的收费模式。三款产品源自三种不同的企业管理文化。 钉钉脱胎于阿里的中台与…

  • 连锁服务小程序、APP定制开发:为什么标准品不够用?

    连锁服务小程序、APP定制开发:为什么标准品不够用?

    连锁品牌扩张到一定规模,都会遇到同一个问题:顾客在A门店的体验和B门店对不上,会员信息各存各的,总部根本看不到实时数据,促销活动发下去执行情况全凭门店自觉。这个时候,一个打通所有门店的数字化工具变得不可或缺。 连锁服务小程序和APP,本质上是连锁品牌的”数字化门面”——前端给用户提供预约、下单、积分、会员服务,后端打通门店管理、库存、财务、员工各个环节。不同于单店工具,它的核心价值在于”连”:用户数据连、库存连、营销策略连、管理权限连,总部和门店之…

    新闻中心 2026-03-31
  • CRM客户管理系统如何为企业带来更加高效的发展?

    CRM客户管理系统如何为企业带来更加高效的发展?

        CRM系统也称客户管理系统,通过对客户资源的集成管理、统计分析和深度挖掘,不断提高客户满意度和忠诚度,最终达到提升销售业绩、市场份额和竞争力的目的。对任何企业而言,客户资源都是赖以生存的宝贵资产,CRM客户管理系统已经成为企业标配。 企业里的销售部门是为企业创造利润,给客户传送价值的媒介,作为销售人员,懂得经营客户关系,以满足客户特定需求的过程,现在社会中,客户大多数都是享受型的消费,因此,恰当的服务和走心的推荐往往能够事半功倍。 CRM客户管理系统,可以实现企业对销售人员和客户的综合管…

    新闻中心 2024-03-19
  • 魁鲸科技浅谈智慧办公

    魁鲸科技浅谈智慧办公

    随着数字化变革进程的加快,企业之间的竞争也愈发激烈,传统办公管理模式已经严重滞后,因此魁鲸科技认为定制开发一款智慧办公系统的开发对于企业来说是非常必要的,通过智慧办公系统的使用,提升企业办公效率及员工体验。     智慧办公功能模块:   企业用车申请 申请人通过系统提出申请,系统会自动发送给指定的人员审批,审批通过后后台发送通知单给司机,司机通过通知单上的派车信息登车(扫码),同时生成任务派车信息单发送给申请人;任务完成后,系统将自动生成派车清单明细,包括日期、用…

    新闻中心 2022-11-03
  • 企业生产管理系统定制如何为企业提高生产力并提升品质?

    企业生产管理系统定制如何为企业提高生产力并提升品质?

     企业生产管理系统开发是企业制造执行系统英文的缩写。它起到了桥梁和纽带的作用,将设计、生产和管理等各个部门紧密地衔接起来,为企业提高生产力和品质提供了有效的保障。 本文将从定制企业生产管理系统开发对于企业的作用、如何选择适合自己的企业生产管理系统开发以及如何加强管理方面进行讨论,帮助企业更好地利用企业生产管理系统开发提高效率。 1、企业生产管理系统开发对于企业的作用 定 制企业生产管理系统开发可以有效地嵌入到企业生产线中,利用软件通过网络实时收集数据,减少人工记录和统计出错的风险。企业生产管理系…

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

联系我们

400-103-7662

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

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

返回顶部