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

 

相关新闻

  • 重庆OA办公系统开发

    重庆OA办公系统开发

    随着企业业务的快速发展和复杂性的不断提高,传统的管理模式已不能满足企业的需求。为了提高工作效率和质量,企业需要使用智能软件和OA办公管理系统来实现智能协作和高效办公。那么在开发OA办公系统时需要具备的基本功能有哪些? OA办公系统智能化可以在提高工作效率、促进协同、数据管理、安全性和客户服务等方面都有一些显著的作用。 解决企业“人、物、事”的数字化难题功能概况: 1、事项流程审批——实行统一管理,便捷操作 OA办公系统的流程审批功能致力于帮助企业规范审批流程,提高审批效率。系统预设了请假、报销、…

    新闻中心 2024-09-06
  • 从西门子到中兴:十款主流IDC管理系统选型对比与适用场景分析

    从西门子到中兴:十款主流IDC管理系统选型对比与适用场景分析

    上个月和某金融科技公司的运维总监聊起DCIM选型,他们刚完成一轮POC测试。十家供应商入围,五家进入RFP,最后三家进沙箱,折腾了三个月。他问我:这些系统到底差在哪?为什么看起来功能差不多,实际用起来天壤之别? 这个问题问到点子上了。DCIM市场经过多年洗牌,功能同质化严重,但落地差异巨大。根据Gartner定义,DCIM核心是监控、测量、管理和控制数据中心资源与能源消耗 ,但各家实现路径完全不同。以下是我梳理的十款主流系统及适用场景。 一、国际一线阵营:平台级能力,适合大型数据中心 Schne…

  • APP软件开发步骤是什么

    APP软件开发步骤是什么

    在移动互联网时代,APP已成为企业与用户连接的重要桥梁。无论是初创公司还是传统企业,开发一款优秀的APP都成为数字化转型的关键一步。那么,一个APP从无到有需要经历哪些步骤呢?本文将为您详细解析APP软件开发的完整流程。 一、需求分析与规划阶段 1、市场调研与用户分析 确定目标用户群体 分析竞品优缺点 明确市场需求和空白点 2、功能需求梳理 列出核心功能清单 区分必备功能与增值功能 绘制用户流程图 3、制定项目计划 确定开发周期 分配开发资源 制定里程碑节点 二、产品设计阶段 1、信息架构设计 …

    新闻中心 2025-07-15
  • 国产信创先行者之路——高新技术企业

    国产信创先行者之路——高新技术企业

    在全球化的浪潮中,信息技术成为推动社会进步的重要力量。随着国际局势的复杂多变,信息安全和技术自主可控日益凸显其重要性。作为国家战略的重要组成部分,国产信创(信息技术创新)系统的发展不仅是技术升级的需要,更是国家安全和经济独立自主的保障。高新技术企业在这一进程中扮演着先行者的角色,他们的探索和实践为国产信创系统的发展奠定了坚实的基础。 一、国产信创系统的重要性 国产信创系统的核心在于构建一个安全可控的信息产业生态,减少对外部技术的依赖,从而保障国家信息安全和经济稳定。在当前国际形势下,拥有自主知识…

    新闻中心 2024-12-03
  • ERP企业管理系统个性化定制

    ERP企业管理系统个性化定制

    在数字化转型浪潮中,企业资源计划(ERP)系统已成为企业管理的重要工具。然而,标准化的ERP解决方案往往难以完全匹配不同企业的独特需求。因此,ERP个性化定制正逐渐成为企业数字化转型的关键。那么,为什么个性化定制的ERP系统如此重要? 一、为什么企业需要ERP个性化定制? 1、行业特性差异大,标准ERP难以满足需求 各个领域(如制造业、零售业、服务业)的业务流程及管理关键各有不同。比如: 制造业:需强化供应链管理、生产排程、质量控制。 零售业:需优化库存管理、会员营销、线上线下数据整合。 标准E…

    新闻中心 2025-08-06
  • 定制进销存管理系统如何解决个体工商户财物管理难题?

    定制进销存管理系统如何解决个体工商户财物管理难题?

    个体工商户,在我国的经济发展中占有重要的地位。是在我国法律允许范围内,不剥削他人、自食其力的劳动者。是吸纳城乡就业的重要途径.个体户的经营有着多样和灵活的特点。特点是以劳动者个人及其家庭成员为主,用自有的生产资料和资金独立地从事生产和经营活动,向社会提供商品和劳务。 一、个体工商户当前所面临的财务管理困境是什么? 是因为人手不足,业务灵活,使得个体户中绝大多数的从业者会计制度不健全,甚至经济规模较大的个体户从业者完全不知道财务制度和财务理念究竟是怎么一回事。加之个体户老板本身素质参差不齐,很多个…

    新闻中心 2024-04-24
  • 探索ERP中的利润计算:加权平均法的分析与解决方案

    探索ERP中的利润计算:加权平均法的分析与解决方案

    在企业资源规划(ERP)系统中,准确计算利润是衡量企业绩效的关键。其中,加权平均成本法(Weighted Average Cost Method)是一种流行的库存估价和利润计算方法。本文将探讨该方法在ERP系统中的应用,分析其优势和劣势,以及提供相应的解决方案。 加权平均成本法概述: 加权平均成本法是一种库存评估方法,它通过计算存货成本和可售存货量的加权平均值来确定商品的成本。在ERP系统中,这种方法简化了库存管理和成本核算,尤其是在处理大量库存和频繁采购的情况下。 优势: 简化计算:加权平均法…

    新闻中心 2024-01-18
  • 外贸CRM客户关系管理软件

    外贸CRM客户关系管理软件

    全球化竞争浪潮下,客户资源就是外贸人的命脉。然而随着全球贸易竞争日趋激烈,传统粗放式客户管理方式已成为外贸企业发展的最大瓶颈。一套专业的外贸CRM系统,正在成为顶尖外贸企业的核心武器。 一、这些企业痛点是否直戳你的心窝? 1、客户信息与跟进过程混乱 客户信息散落在各处(Excel表格、业务员个人电脑、邮箱、WhatsApp、微信、名片等)。人员流动会导致客户流失。跟进过程不透明,经理不知道每个客户的跟进状态和历史。 2、销售流程低效,成单率低 新手业务员不知道如何有效跟进;无法快速识别高意向客户…

    新闻中心 2025-08-20
  • ERP系统开发:中小型生产制造工厂为什么需要建设企业信息化管理?

    ERP系统开发:中小型生产制造工厂为什么需要建设企业信息化管理?

    随着互联网行业的迅猛发展,越来越多的加工制造业企业将互联网作为核心枢纽,这一关键核心枢纽即为企业信息化管理。       在企业信息化管理中,主要包括三个关键方面:企业变革过程管理、企业运作管理,以及信息技术、信息资源、信息设备等信息化实施过程的管理。这三个方面形成了一个不可拆分的框架,相辅相成、互相支持、互相补充,共同构建起融合且相互制约的三角形管理体系,为企业提供了坚固的支持。企业信息化管理通过这种全面的管理方式,能够更好地适应信息技术的快速发展,实现企业的全面提升。     随着互联网的迅…

    新闻中心 2024-04-03
  • CRM客户关系管理系统具备哪些特点?

    CRM客户关系管理系统具备哪些特点?

    客户关系管理系统的发展历程主要经历了基于呼叫中心的 CRM、客户流程管理、客户细分与客户价值开发、企业客户协同开发等几个阶段。基于呼叫中心的 CRM 阶段主要基于热线、销售咨询和品牌关怀,属于被动式服务。 客户流程管理基于对客户信息、交易流程、客户流程管理,属于主动式服务,尝试客户细分与需求分析,关注满意度。客户细分与客户价值开发是在第二层基础上,进行建模分析,分辨不同客户的价值,最大化企业利润。企业客户协主要为维系客户关系,通过满意度反馈,提升服务品质。 一、客户关系管理项目的正面影响主要体现…

    新闻中心 2024-04-22
在线沟通
客服微信
客服微信
在线咨询
联系我们

联系我们

186-96588-163

售前咨询邮箱:
767272915@qq.com

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

返回顶部