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

 

相关新闻

  • 当企业通讯需要走出“灰色地带”:定制即时通讯软件的架构思考

    当企业通讯需要走出“灰色地带”:定制即时通讯软件的架构思考

    你是否发现,团队在使用微信或钉钉讨论核心业务时,敏感数据、客户信息、项目细节在公共服务器上流转,这让合规部门深感不安?这是一个典型的“灰色地带”:通用通讯工具带来了便利,但数据主权缺失、业务流程割裂与功能僵化的问题,正随着企业数字化深入而日益凸显。 当业务通讯需求超出“拉群聊天”时,定制开发便成为值得认真评估的选项。它不只是做一个内部聊天工具,其核心目标是构建一个紧贴业务流的安全通讯管道。 一、技术架构的核心:在实时性与可控性间取得平衡 定制IM系统与采用公有云服务在技术路径上有本质区别。你需要…

  • 制造业转型升级的关键:企业管理软件的应用与优势

    制造业转型升级的关键:企业管理软件的应用与优势

    在当今全球制造业竞争日益激烈的背景下,制造业作为经济的重要支柱,近年来受到多重因素影响,面临着各类挑战。首先,市场竞争日益激烈,客户需求日新月异,企业必须不断创新以满足市场要求。为了提升生产效率、优化资源配置、增强市场竞争力,制造业的转型升级已成为不可逆转的趋势。企业管理软件的出现为制造业提供了一种高效的解决方案,从而推动了行业的发展和变革。魁鲸小编今天将深入带您探讨企业管理软件在制造业中的重要性及其带来的诸多优势。 1、提高运营效率企业管理软件通过自动化和流程化管理,显著减少了人工干预和错误,…

    魁鲸新闻 2024-07-22
  • 保险行业财务管理系统解决方案

    保险行业财务管理系统解决方案

    在保费收入波动加剧、赔付支出结构日益复杂的当下,保险行业的财务管理正面临数据割裂、手工依赖、核算粗放、合规高压等前所未有的挑战,这些问题不仅侵蚀利润,更可能引发经营风险。 魁鲸科技深刻理解保险财务痛点,推出新一代保险行业财务管理系统解决方案——为高效、精准、合规的财务管理赋能。 一、保险行业传统财务管理痛点 1、人工处理繁琐和耗时 业务流程涉及到投保、承保、理赔等多个环节 2、数据安全和隐私保护受挑战 保险行业涉及到大量的个人和敏感信息 3、数据整合和共享难 财务数据往往分散在不同的系统和数据源…

    新闻中心 2025-07-22
  • 如何定制oa系统提高企业工作效率?

    如何定制oa系统提高企业工作效率?

    随着数字化转型的进程,越来越多的企业选择使用oa系统来管理日常操作流程,并逐渐将其认为是提高工作效率的关键。然而,标准的oa系统不能完全满足每个企业独特的需求。通过定制oa系统以更好地适应自己公司的工作流程和流程,可以更大限度地实现提高工作效率的目标。 1. 定义您的需求和工作流程 oa系统需要与企业的具体情况相匹配,因此首先要明确企业的工作流程和业务需求,以便找到最合适的oa解决方案。对于不同的部门和员工的不同作业场景和操作方式都要进行分析,以确保oa系统足够灵活,能够满足整个企业的需求。 2…

    新闻中心 2024-02-26
  • 中小企业CRM系统定制开发

    中小企业CRM系统定制开发

    CRM系统是一种集各种技术和方法于一体的应用程序,旨在帮助企业集中管理客户信息,跟踪销售活动,分析市场趋势,优化客户服务流程,促进跨部门合作,实现更高效、更个性化的客户关系管理。 企业客户管理六大难题要览: 企业销售目标预测难、精准找到客户难、销售赋能难、销售过程精细化管理难等 线索量多且杂,渠道线索无法统一管理。 低效的客户服务工作、被动的客户服务管理、不佳的客户体验等业务挑战。 销售跟进不透明,输单原因不知晓。 客户资源掌握在个人销售手中。 不能打通营销服一体化数字化管理。 CRM是企业最重…

    新闻中心 2024-10-10
  • 定制手机商城:技术如何塑造商业韧性

    定制手机商城:技术如何塑造商业韧性

    我们团队经手过不少手机零售商的软件定制项目。一个清晰的感受是:大家最初的关注点往往在“线上展示”与“下单支付”等显性功能上,但项目的成败与长期价值,实则取决于对几个隐性技术架构的选择。这些选择决定了商城是能伴随业务敏捷成长的“发动机”,还是逐渐僵化、难以维护的“负担”。 避开第一个误区:仅把定制看作“界面皮肤” 许多项目始于对UI和品牌一致性的要求,这很合理。但如果定制仅停留在这一层,就错失了核心价值。真正的定制,应深入业务内核,尤其是商品与库存的动态模型。手机销售涉及颜色、存储容量、版本(如国…

  • B2B/B2C电商平台定制开发:构建差异化竞争优势的核心战略

    B2B/B2C电商平台定制开发:构建差异化竞争优势的核心战略

    您的线上业务,是否也遇到了这些“天花板”? “我们的产品特性特殊,购物车流程根本不适合……” “客户要求复杂的报价和合同流程,现有平台无法实现……” “促销活动想玩出新花样,但系统功能就是不允许……” “数据散落在各处,无法形成有效的商业洞察……” 如果您对以上问题感同身受,那么您可能已经触及了标准化SaaS模板电商平台的“天花板”。当您的业务模式越独特,增长需求越旺盛,模板的束缚感就越强。 今天,我们就来深入探讨,为什么对于追求长期价值和差异化竞争的企业而言,B2B/B2C电商平台的定制开发,…

    新闻中心 2025-11-12
  • ERP系统定制开发的优势有哪些

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

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

    新闻中心 2024-08-09
  • WMS云仓储管理系统开发

    WMS云仓储管理系统开发

    在当今电商蓬勃发展的时代,仓储管理已成为企业供应链中不可或缺的一环。随着订单量的激增、商品种类的多样化以及客户对物流时效要求的提高,传统仓储管理模式已难以满足现代企业的需求。正是在这样的背景下,WMS云仓储管理系统应运而生,成为企业智能化升级的重要工具。 一、什么是WMS云仓储管理系统? WMS(Warehouse Management System)即仓储管理系统,是一种通过信息化手段对仓库作业流程进行优化和管理的系统。云存储系统软件是将W系统部署到云中,并通过网络给予帮助。客户可以通过浏览器…

    新闻中心 2025-08-27
  • 智慧巡检管理系统开发:【魁鲸科技】让传统巡检效率飙升200%!

    智慧巡检管理系统开发:【魁鲸科技】让传统巡检效率飙升200%!

    填不完的表格、跑不完的现场、查不完的数据……传统巡检模式不仅效率低下,还隐藏着成本高、易出错、难监管的致命弊端。上海魁鲸科技有限公司推出智慧巡检管理系统,实现巡检业务从纸质化到信息化、数据化的升级,推动数字化转型的同时显著提升降本增效成效。 一、传统巡检的痛点 在智慧巡检系统出现之前,企业主要依赖人工巡检,这种方式存在诸多问题: 1、效率低下:人工记录、纸质报告,数据整理耗时耗力。 2、易出错:人为疏忽可能导致漏检、误检,影响设备正常运行。 3、管理困难:巡检数据难以实时共享,历史记录查询不便。…

    新闻中心 2025-06-19
在线沟通
客服微信
客服微信
在线咨询
联系我们

联系我们

400-103-7662

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

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

返回顶部