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

 

相关新闻

  • 专业APP开发:开发一个APP需要多少钱

    专业APP开发:开发一个APP需要多少钱

    在移动互联网时代,用户越来越倾向于使用手机进行日常活动,如购物、社交、娱乐等。开发APP可以让企业更好地融入用户的日常生活,提高品牌曝光度和用户粘性。同时在数字化转型的大背景下,APP开发成为企业转型升级的重要一环,因此很多企业会选择开发自己的APP,但是开发一个APP需要多少钱呢?今天魁鲸小编就从多方面分析一下。 开发应用程序的成本并不是一成不变的,它受到许多因素的影响,包括APP的复杂性、功能要求、设计要求、开发团队的经验和规模,以及开发平台。以下是对这些因素的详细分析: 一、APP的复杂性…

    行业经验分享 2024年7月29日
  • 火锅店点餐小程序定制开发

    火锅店点餐小程序定制开发

    一、市场需求和发展前景 据统计,中国火锅市场规模已经超过1000亿元,仍然保持着快速增长的趋势。同时,随着年轻人消费能力的提高和生活方式的多样化,他们对火锅消费的需求也越来越迫切。因此,火锅小程序的发展具有巨大的市场需求和发展前景。未来,火锅小程序开发将成为火锅行业数字化转型的必然选择,也将成为消费者就餐的首选工具。 二、小程序功能描述  1、用户 随时预订,随时排队,到号提醒 惊喜优惠,随时点餐 优惠营销拓客 2、门店 堂食自助点餐,餐位管理 优惠活动,服务员管理 原料统计/管理 收银管理 小…

    新闻中心 2024年9月18日
  • 中小企业OA系统定制开发

    中小企业OA系统定制开发

    随着科技的进步,中小企业需要一种能够充分发挥自身个性化优势、风险低、性价比高、维护方便的信息解决方案。对于中小企业来说,规模相对较小,企业内部管理很难实现一体化,因此,中小企业很有必要进行OA系统定制开发。 一、中小企业OA系统定制原则: 1、OA定制化实施成败的关键在于中小企业用户自身的经验。 2、OA负责人组织需求管理,明确自己的需求,明确合理地规划需求,合理地规划和做好预算。 3、中小型企业定制开发资金投入相对有限,OA定制需要依靠产品的平台开发能力,降低开发技术难度、开发成本和开发周期,…

    新闻中心 2024年9月26日
  • 上门服务小程序:颠覆传统服务业的新生力量

    上门服务小程序:颠覆传统服务业的新生力量

    随着移动互联网的飞速发展,越来越多的商业模式应运而生。上门服务小程序作为一种新的服务方式,正在逐渐改变消费者的日常生活和服务体验。这一上门服务是通过小程序实现的,不仅提高了服务的便利性,而且给传统服务业带来了新的机遇。本文将详细讨论上门服务小程序的优势、市场现状和发展趋势,以及如何利用小程序提高服务质量和市场竞争力。 上门服务小程序的概念 上门服务小程序是基于社交平台(如微信)的应用程序。通过简单的操作,用户可以在手机上选择所需的服务,并向服务人员申请上门解决问题。这类服务通常涵盖家政、维修、美…

    新闻中心 2025年6月14日
  • 公司运用CRM客户管理系统需要注意哪些问题?

    公司运用CRM客户管理系统需要注意哪些问题?

    根据调查显示,大型企业为了CRM客户关系管理系统的安装执行所花费的资金通常是很大的,与此同时,各个公司在CRM项目上的投资不仅仅是金钱上的,而且还是时间上的,通常需要几个月甚至更长的时间。 因此企业在正式开始自己的CRM项目之前,了解一下其他公司CRM客户管理系统项目实施的失败原因是非常重要的,只有这样才能使自己的公司避免重复其他公司曾经犯过的错误。可能你们企业也会遇到的:   1、CRM系统商宣传夸大和客户不切实际的期望 与对待大多数新技术一样,部分CRM系统商对CRM技术进行了夸大的宣传。这…

    新闻中心 2024年3月19日
  • ERP智慧餐饮管理系统

    ERP智慧餐饮管理系统

    餐饮ERP系统是为餐厅行业量身定制的ERP软件,旨在帮助餐厅管理者实现高效便捷的运营管理。而销售管理作为企业收入循环的重要前提,涉及从潜在客户挖掘到最终成交的全过程。因此,在餐饮ERP系统中,销售管理应包含哪些模块? 一、什么是ERP系统销售管理? 销售管理是利用企业资源规划系统优化销售流程,提高销售效率的管理方法。销售过程的自动化和智能化可以通过整合客户、销售订单、库存数据等资源来实现。在ERP销售管理中,企业可以实时掌握销售趋势,优化销售策略,提高客户满意度,实现销售目标和业绩增长。 二、销…

    新闻中心 2024年9月9日
  • 企业ERP系统建设对于公司有哪些重要意义?

    企业ERP系统建设对于公司有哪些重要意义?

    目前,企业资源规划(ERP)系统已经成为现代企业管理的重要工具。作为一种集成管理软件,ERP系统本身具有复杂性、集成性的特点,因此企业在进行ERP系统建设的过程中也会面临各种问题和挑战。本文讨论了企业ERP系统建设的重要性、存在的问题,并提出了解决办法,以帮助企业更好地实施和管理ERP系统。 ERP是一种集成化的企业资源管理系统,它通过将企业的各个部门如采购、制造、销售、财务等进行整合,实现对整个供应链的全面管理和控制。同时,它还能够帮助企业优化业务流程,降低成本和提高效率。 随着互联网技术和大…

    新闻中心 2024年4月7日
  • 魁鲸科技浅谈电商商城系统

    魁鲸科技浅谈电商商城系统

    目前已进入全面数字化的社会,软件系统运用到人们生活的方方面面,其中电商商城可谓是人们最为熟知的一款系统了。随着电商的高速发展,一些传统企业纷纷开始转型,通过搭建一线上电商商城系统来打破传统实体店运营模式所陷入的僵局。下面魁鲸科技就以专业软件开发公司的角度来告诉大家一块电商商城系统需要有那些功能模块? 用户端: 1、首页一般汇聚了商城平台最热卖的商品或者处于热销活动中的推荐商品,玲琅满目的商品列表配上图文远超线下逛街的体验;首页可以快捷的进行分类筛选商品 2、用户可以通过点击商品进入商品详情页,详…

    新闻中心 2022年10月20日
  • 无人机盘库新思路 一人一机解决万平难题

    无人机盘库新思路 一人一机解决万平难题

    在现代物流与仓储管理中,库存盘点一直是一项耗时且复杂的任务。传统的人工盘点方式不仅效率低下,还容易出现错误。然而,随着无人机技术的飞速发展,这一难题正得到革命性的解决。 一、无人机盘库的优势 1. 高效性:无人机盘库可以在短时间内覆盖大面积的仓库空间,快速扫描货架上的条码或RFID标签。这种高效的扫描能力使盘点时间大大缩短,从原来的数天缩短至数小时甚至更短。例如,某大型电商仓库通过引入无人机进行库存盘点,每次盘点时间从原来的两天缩短到了两个小时。 2. 准确性:无人机配备的高精度摄像头和传感器能…

    新闻中心 2024年12月4日
  • 工厂仓库管理系统erp都一样吗?工厂仓库管理系统erp入库流程

    工厂仓库管理系统erp都一样吗?工厂仓库管理系统erp入库流程

    很多工厂老板都有这样的一个疑惑,那就是工厂仓库管理系统erp都一样吗?其实是存在一定差异的。因为不同ERP系统的仓库管理系统在业务细化需求、功能深度、行业适配性以及技术实现方式等都有不同之处,像一些大型的工厂,它的业务繁多,那么相对应的人员以及货物管理流程也会复杂,那么功能模块就需要更加精细化,尽量避免沟通运营成本。 一、仓库管理系统类型 1. ‌功能差异‌ ‌基础型ERP‌(如部分通用系统): 仅支持入库、出库、库存查询等基础功能,缺乏与生产、采购的深度联动。 ‌示例‌:某些中小型ERP仅提供…

    FAQ 2025年5月4日
在线沟通
客服微信
客服微信
在线咨询
联系我们

联系我们

400-103-7662

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

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

返回顶部