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

 

相关新闻

  • 存货管理的主要模式有哪些?最常用的方法有哪些?

    存货管理的主要模式有哪些?最常用的方法有哪些?

    企业常用的存货管理方法主要有四种分别为定量控制模式、定期调控模式、ABC分类法按价值分级管理库存、需求驱动模式。这些方法各有侧重,企业需要根据自身需求和供应链特点选择合适的模式,才能实现库存的高效管理。 一、‌定量控制模式‌ 通过设定固定订货点与订货量,实现库存动态监控与补货决策。例如,当库存水平低于预设阈值时,自动触发补货流程,确保库存维持在合理区间。 二、‌定期调控模式‌ 在固定时间周期内检查库存,并根据需求预测调整补货量。此模式强调计划性,通过周期性复盘优化库存水平,但灵活性较低。 三、‌…

    FAQ 2025年5月27日
  • 进销存系统开发-上海魁鲸科技

    进销存系统开发-上海魁鲸科技

    为了提高企业竞争优势,提升企业自身的运营效率和管理水平,进销存系统作为企业管理的重要工具,能够帮助企业实现采购、销售、库存等业务流程的自动化和智能化。那么在线进销存系统有什么优势? 1、数据实时更新,业务数据实时控制 通过云技术和数据的实时同步,企业管理者即使出差在外,也可以随时访问最新的业务情况。 用户在任何地方任何时间都可以访问操作,随时随地办公。突破了时间和空间限制。 2、多店异地协作,业务运营不受限制 多门店、多仓库、多办公室,无需购买昂贵的服务器。通过浏览器,可实现移动管理,实现高效协…

    新闻中心 2025年1月2日
  • 一物一码防伪防窜货系统:品牌保护与营销增长的终极武器

    一物一码防伪防窜货系统:品牌保护与营销增长的终极武器

    在竞争白热化的市场环境中,品牌方正面临双重夹击: 1、外部——假冒伪劣产品蚕食消费者信任,损害品牌声誉;2、内部——渠道窜货扰乱价格体系,引发经销商矛盾,削弱市场管控力。 传统的防伪标签易被复制,人工稽查成本高、效率低,渠道数据层层失真,企业如同“盲人摸象”。而一物一码防伪防窜货系统技术的成熟应用,正在为这一困局提供系统性解法——它不仅是防伪防窜的“盾牌”,更是连接终端、激活数据、驱动增长的“数字引擎”。 一、您的品牌是否正遭遇这些痛点? 消费者扫码验真后仍心存疑虑? 经销商因价格混乱、窜货频发…

    新闻中心 2025年11月25日
  • 软件系统定制开发

    开发一款英语学习APP能为学生带来哪些功能?

    随着教师教育技术能力的不断提升,由教师根据师生需求自主设计开发学习 App 成为可能。为解决学生利用英语学习APP学习英语的适应性和个性化方面存在的问题,本文对教师根据教与学的需求,如何自主设计开发英语学习APP进行研究,为教学改革提供一定的新思路。 这套系统设计开发的英语学习APP目标人群明确为高职计算机应用类相关专业学习计算机英语的学生。学生需要在 App 端完成《计算机英语》课程规定的词汇、会话和短文的学习。该系统基本功能包括学习首页、学习中心、课程中心和个人中心。 一、英语学习APP开发…

    新闻中心 2024年4月17日
  • CRM客户关系管理系统具备哪些特点?

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

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

    新闻中心 2024年4月22日
  • 定制开发安全隐患系统-上海魁鲸科技

    定制开发安全隐患系统-上海魁鲸科技

    随着企业规模的扩大和业务扩张,企业运营中存在越来越多安全风险。传统安全风险管理机制耗时费力,工作效率低,容易漏验和误检。为了解决这一问题,魁鲸科技推出了智能安全隐患管理系统。其具体功能如下: 1、用户管理 用户管理功能菜单可实现系统内顾客的新增、删掉、变更、查询等情形。 2、权限管理 权限管理功能菜单能够监管顾客的权限,包含角色设定、权限分配、权限审批等行为。 3、数据分析 数据分析功能菜单能够实时统计系统内安全隐患信息,产生表格并提供图表显示。 4、提交安全风险 安全风险提交功能菜单可上传各类…

    新闻中心 2025年2月21日
  • 深圳,智慧打造城市

    深圳,智慧打造城市

    深圳市大力推进“智慧城市”建设,数字技术正改变着各区政府的治理方式。魁鲸科技团队倾心打造数字城市,构建数字政府、数字民生、数字治安结合的智慧深圳。 深圳市大力推进“智慧城市”建设,不断提高民生服务水平和城市治理能力,数字技术正改变着市民的生活。   管理更精细——  构筑智慧城市的数字“智慧城市” 深圳是我国首批新型智慧城市试点城市。2018年,深圳出台《深圳市新型智慧城市建设总体方案》,坚持全市“一盘棋”“一体化”原则,大力推进新型智慧城市建设。 智慧城市是看待城市的新角度,是发展城市的新思维…

    新闻中心 2022年5月22日
  • 医院智能柜APP开发对医院有哪些好处?

    医院智能柜APP开发对医院有哪些好处?

    随着医疗行业的快速发展,医院智能柜软件具有高度的智能化和自动化。这类软件通常集成了物联网、大数据、人工智能等技术,能够自动识别、追踪和管理物品,减少人工干预和操作环节,大大提高了医院的工作效率和管理水平。一、提高管理效率。 传统的医院仓库管理方式存在着很多问题,比如存储空间不足、药品管理不规范、药品信息不准确等。而医院智能柜项目可以有效地解决这些问题,通过智能化管理,可以快速准确地获取药品信息,提高管理效率。同时,医院智能柜项目还可以实现药品的自动化分拣和配送,减少人力资源的浪费,降低成本。 二…

    新闻中心 2024年2月21日
  • ERP系统开发企业有哪些-上海魁鲸科技

    ERP系统开发企业有哪些-上海魁鲸科技

    ERP系统作为企业管理的利器,很多企业有开发ERP系统的念头。那么,一起来看看ERP系统开发企业,它们具备自己特色的ERP管理软件开发,给您提供参照。 一、用友网络科技股份有限公司(Yonyou) 用友网络科技有限公司创立于1988年,总部位于北京,是一家综合性ERP管理软件开发企业。在ERP领域有丰富的经验,为企业提供金融、供应链、制造等层面的管理体系和解决方案。 服务特性:功能齐全的企业资源规划体系,适用多语言、多货币、全球化经营,可以满足中大企业繁杂的业务需求。 典型客户:包含中铁、中粮集…

    新闻中心 2025年2月10日
  • 中小型企业如何定制CRM软件

    中小型企业如何定制CRM软件

    在当今信息技术飞速发展的时代,客户关系管理软件已成为企业管理与客户互动不可或缺的工具。特别是对于中小企业来说,定制的CRM系统不仅可以帮助他们更好地了解客户需求,提高服务质量,还可以优化销售流程,提高业务效率。那么,中小企业应该如何定制自己的CRM软件呢? 明确需求是定制客户关系管理软件的第一步 中小企业应结合自身实际情况,梳理通过客户关系管理系统实现的具体目标,如改进客户信息管理、加强销售管道跟踪、提高售后服务水平等。通过与团队成员的深入沟通,收集不同角色的需求,形成详细的需求文档。 下一步是…

    行业经验分享 2024年8月9日
在线沟通
客服微信
客服微信
在线咨询
联系我们

联系我们

400-103-7662

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

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

返回顶部