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

 

相关新闻

  • 一体化财务管理系统平台:重构财务数字战斗力

    一体化财务管理系统平台:重构财务数字战斗力

    一体化财务管理系统通过整合财务核算、资金管理、税务管理、预算控制等模块,实现全流程数字化管理,赋能企业财务数字化转型,能帮助企业重构财务数字战斗力,实现高效、智能、协同的财务管理新范式。 一、传统财务管理的痛点 1、数据孤岛严重:财务、业务、税务等系统相互割裂,数据难以互通,影响分析效率。 2、流程效率低下:手工录入、重复审批、纸质单据流转导致财务处理周期长,错误率高。 3、决策支持不足:财务报表落伍,欠缺实时数据分析,高管不能及时得到有效的关键依据。 4、合规风险增加:随着监管趋严,传统财务模…

    新闻中心 2025年8月1日
  • OA办公系统-上海魁鲸科技

    OA办公系统-上海魁鲸科技

    OA办公系统(Office Automation System)是一种用于提升企业办公效率、优化管理流程的软件系统。它通过信息化手段,将日常办公事务数字化、自动化,帮助企业实现高效协同、资源管理和信息共享。具体核心功能如下: 1、流程审批: 支持请假、报销、采购等各类审批流程的自动化。 自定义流程,适应不同业务需求。 2、文档管理: 提供文档上传、下载、版本控制等功能。 支持权限管理,确保文档安全。 3、协同办公: 支持即时通讯、任务分配、日程安排等。 推动团队协同办公,提升工作效率。 4、考勤…

    新闻中心 2025年3月12日
  • 上海小程序开发公司:旅游小程序该如何制作

    上海小程序开发公司:旅游小程序该如何制作

    在数字化时代,旅游业正经历着前所未有的变化,其中旅游小程序的兴起为游客提供了更方便、更个性化的旅游体验。作为国际大都市上海的一家专业小程序开发公司,我们知道如何创建一个吸引用户、高效和实用的旅游小程序是非常重要的。下面,魁鲸小编将从几个关键步骤开始,讨论旅游小程序的制作过程。 1. 明确需求和目标用户首先,明确小程序的核心功能和目标用户群是开发的首要任务。旅游小程序可涵盖景点介绍、门票预订、行程规划、导航服务、酒店预订、特色食品推荐等功能模块。同时,分析目标用户的年龄、兴趣和消费习惯,确保小程序…

    行业经验分享 2024年8月5日
  • 财务软件ERP开发-上海魁鲸科技

    财务软件ERP开发-上海魁鲸科技

    财务软件ERP是指企业资源计划(ERP)结合系统和财务管理功能的软件解决方案。随着智能时代的到来,自动化财务流程逐渐进入企业管理者的视野,希望获得该软件,以提高财务管理的整体水平。那么,企业为什么要选择财务软件ERP呢? 1、自动化处理——提高工作效率 通过自动处理财务事务,减少手动操作,降低出错率,提高工作效率。 2、提高数据准确性——减少人为错误 财务软件ERP能保证数据的一致性和准确性,减少人为错误,提高数据质量。 3、实时数据分析——便于及时决策 ERP可以实时获取和分析数据,帮助企业做…

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

    软件系统定制开发的必要性

    随着科技不断进步,软件系统在我们的生活中扮演着越来越重要的角色。对于一些企业或组织来说,成品软件可能并不能完全满足他们的需求。这时,定制开发软件系统就成为了一种非常流行和有用的选择。本文将从优缺点对比成品软件,并详细描述如何合作做好一个定制系统。 一、成品软件的优缺点 成品软件是指那些已经被开发和销售的,可以被大众使用的软件系统。相对于定制开发软件系统,成品软件有其优缺点。 优点: 成品软件通常价格较低。因为它们的研发和制造过程是被分摊成了许多用户的购买费用,所以成品软件通常价格更加亲民。 成品…

    新闻中心 2023年6月7日
  • 宝山区用这张“樱花卡”吸引优秀人才,涵盖衣食住行等30余项服务-个人紧急事务享受专人帮办

    宝山区用这张“樱花卡”吸引优秀人才,涵盖衣食住行等30余项服务-个人紧急事务享受专人帮办

    晨报记者 何雅君 一张小小的樱花卡,涵盖了衣食住行等方面的福利,为生活带来了便捷。昨天召开的“2019年宝山区进一步优化营商环境 推进经济高质量发展工作会议”上,宝山区推出了优秀人才樱花服务卡项目。 会上,22名区级优秀人才获颁首批钻石卡和白金卡,按照同步颁发的《宝山区优秀人才樱花服务卡使用手册》,他们将享受18个方面30余项的优质服务资源。下一步,各街镇也将陆续为街镇相关人才颁发该卡的金卡和银卡,并提供人才身边的衣食住行便利服务。 整合30余项服务资源 优秀人才樱花服务卡分为钻石卡、白金卡、金…

    新闻中心 2022年6月26日
  • 企业erp开发需要考虑哪些重要的问题?

    企业erp开发需要考虑哪些重要的问题?

     erp开发定制是一种集成化的企业信息化解决计划,涵盖了企业各个方面的处理,比如财务、人力资源、供应链等。跟着企业规模的扩大和业务的复杂化,越来越多的企业开始寻找适宜自己的erp开发定制。但怎样选择适宜企业的erp开发定制却是一个非常复杂和困难的问题。本文将从几个方面评论怎样选择适宜企业的erp开发定制。 首要,企业应该考虑erp开发定制是否适宜自己的业务流程。 不同的企业有不同的业务方式,因此需求不同的erp开发定制来满意不同的需求。企业在选择erp开发定制之前,需求先了解自己的业务方式和流程…

    新闻中心 2024年4月9日
  • 上海app开发公司有哪些?定制app开发公司推荐

    上海app开发公司有哪些?定制app开发公司推荐

    专注app开发行业的朋友应该清楚,目前上海APP开发行业现状是技术与需求双轮驱动,2024年上海移动互联网市场规模突破千亿级,企业定制化APP需求激增。作为全国科技产业高地,上海聚集了华为、联想等头部企业研发中心,同时涌现出魁鲸科技等一批深耕垂直领域的创新型企业,形成“技术密集+场景创新”的双重优势。 一、定制开发公司推荐:上海魁鲸科技的核心竞争力 ‌1. 技术实力铸就行业标杆‌ ‌全栈开发能力‌:提供app开发、小程序定制设计、ERP系统软件定制、物联网开发、AI算法等全链路数字化解决方案,覆…

    新闻中心 2025年5月2日
  • 私域新零售app开发定制

    私域新零售app开发定制

    在流量红利见顶的当下,私域运营已成为企业数字化转型的核心战场。开发一款专属的私域新零售APP,不仅能帮助商家摆脱平台依赖,更能深度连接用户、提升复购率、实现精准营销。 一、为什么私域新零售App成为品牌必选项? 1、流量自主权:摆脱平台抽佣和规则限制,实现用户资产私有化 2、精准营销:基于用户画像的个性化推荐,转化率提升3-5倍 3、数据闭环:完整掌握用户行为路径,优化运营决策 4、成本优势:相比公域获客,私域复购成本降低60%以上 二、私域新零售APP核心功能模块 1、用户端功能 注册登录(手…

    新闻中心 2025年8月11日
  • 智慧小型工厂erp管理系统软件

    智慧小型工厂erp管理系统软件

    传统的小型工厂管理一般借助人工干预和Excel汇报,容易出现数据错误、库存错乱、生产规划落伍等问题。而ERP系统能够整合企业的生产、采购、销售、库存、财务等核心业务流程,实现数据互通和高效协同。 一、为什么小型工厂需要ERP管理系统? 1、提高生产效率:优化生产排程,减少停机时间,提升设备利用率。 2、精准库存管理:实时监控原材料和成品库存,避免缺货或积压。 3、成本管理:减少人工统计错误,提升采购方案,降低成本。 4、数据分析与决策支持:依据可视化报表,促进企业管理者作出更科学的企业决策。 5…

    新闻中心 2025年8月19日
在线沟通
客服微信
客服微信
在线咨询
联系我们

联系我们

400-103-7662

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

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

返回顶部