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

 

相关新闻

  • 互联网时代,定制开发小程序成电商行业新趋势?

    互联网时代,定制开发小程序成电商行业新趋势?

    随着互联网的不断发展,互联网电商行业也随之成为一大热点,并逐渐给人们的社会生活方式和思维方式带来了重大变革,可以说,网购已成为购物的的主流,电商产业也无疑成为了互联网行业中重要的一个篇章。 电子商务作为商业在互联网领域的应用典型,已经拥有了成熟的发展模式,在继续加速增长,相对于实体零售的市场份额在扩张,但同样也面临加速转型的挑战。 电子商务在不断的进化中,电商的发展从PC端电商平台到移动电商平台再到微信电商和小程序商城的开发,皆正朝着移动化、互动体验及个性化等方向发展。就拿如今热门的小程序商城开…

    新闻中心 2024年3月12日
  • 上海软件系统定制开发价格怎么样

    上海软件系统定制开发价格怎么样

    软件开发,作为一个充满创新和挑战的行业,在全球范围内都备受关注。特别是在中国的经济中心——上海,这里的软件开发市场活跃,需求多样,从初创企业到大型跨国公司,都对软件系统开发寄予厚望。但一个不可避免的问题总是悬在决策者的心头——开发一套软件系统,究竟需要投入多少成本? 为什么要企业软件一定要定制? 很多企业会放弃使用软件系统,其中最大的原因是没选对,从而片面的认为企业没有达到使用软件系统的高度。 上海魁鲸通过多年经验分析,不是因为企业自身高度不够,是没有选择到真正适合自己的软件系统,有时候企业会因…

    新闻中心 2024年8月8日
  • 智慧安全生产信息化管理系统开发-上海魁鲸科技

    智慧安全生产信息化管理系统开发-上海魁鲸科技

    为促进企业实现安全生产全信息智能化管理,有效提升安全管理水准,魁鲸科技设立了智慧安全生产信息化管理系统,旨在帮助企业落实风险预防责任,创建智能风险分级控制系统。 一、传统安全生产管理五大难题 1、安全管理效率低,需要很多人力资源长期投入 2、传统的安全管理一般在于人力判定和经验,容易出现主观与不精确性。 3、传统的安全管理往往缺乏可溯源,一旦发生安全事故,就难以上溯到具体责任人和事故原因。 4、传统的安全管理需要大量人力资源和物力资源投资,成本更高。   二、企业智能安全生产信息管理系…

    新闻中心 2025年1月16日
  • 魁鲸科技论ERP定制开发的必要性

    魁鲸科技论ERP定制开发的必要性

    数字化是近两年的热点话题,随着5G技术的普及,各行业都逐渐加强企业信息化建设。可以说几乎所有企业都拥有一套ERP,ERP在市场上的成品也是最多的,比较出名的ERP成品有金蝶,用友等,因此但大部分的企业在选择时都偏向通用版成品ERP软件,至于要一次性支出,企业就可以获得一款完整的ERP软件。但企业的发展不可能一尘不变,业务不断的扩大,因此通用版ERP可能只能满足企业一时的需求,一旦业务模式发生变化,它将不再适合。那下面魁鲸科技就从专业的角度来大家了解一下定制开发一款ERP软件的好处。  …

    新闻中心 2022年8月23日
  • 上海ai软件开发公司

    上海ai软件开发公司

    作为中国的经济中心和科技创新高地,上海已成为人工智能产业发展的重要枢纽。近年来,上海AI软件开发公司如雨后春笋般涌现,形成了从基础算法研究到行业应用落地的完整产业链。这些企业不仅推动了本地经济转型升级,更为全球AI技术进步贡献着”上海智慧”。 一、 AI软件开发的核心技术 1、机器学习(Machine Learning, ML) 机器学习是AI的核心,它让计算机能够从数据中学习规律并做出预测。常见的机器学习方法包括: 监督学习(如图像识别、语音识别) 无监督学习(如聚类分…

    新闻中心 2025年8月18日
  • 智能物料管理系统定制开发-上海魁鲸科技

    智能物料管理系统定制开发-上海魁鲸科技

    在制造业数字化转型中,物料管理正成为企业降本增效的核心战场。目前,使用通用型物料管理系统的企业,因流程适配度不足,导致库存准确率直线下降、物料浪费率不断升高、采购成本严重超支等问题。因此,为了实现物料精细管理,有效消除浪费,魁鲸科技定制开发智能物料管理系统,旨为破解企业困局的战略性选择。 一、物料精细管理,有效消除浪费 01  物料精准编码,快速区分无混淆 支持按物料分类、名称、型号、拼音码等多种形式编码,也支持年、月、 日顺序递增进行连续性编码,方便企业追溯和检索。 02  物料自动编码,快速…

    新闻中心 2025年2月25日
  • 企业财务管理系统定制:实现财务管理自动化

    企业财务管理系统定制:实现财务管理自动化

    在快速变化的商业环境中,企业财务管理不仅是维持日常经营的基石,也是促进战略决策、优化资源配置、提高竞争力的关键。随着信息技术的快速发展,传统的手工财务管理方法难以满足现代企业高效、准确、智能的需求。因此,企业财务管理体系的定制化发展已成为许多企业转型升级的重要选择,旨在通过自动化手段全面提高财务管理水平。 一、财务管理自动化的重要性 提高效率:自动处理大量财务数据,减少人工操作,显著提高财务处理速度,使财务人员有更多的时间专注于数据分析和战略支持。 降低错误率:自动化过程减少了人为因素造成的错误…

    新闻中心 2024年8月22日
  • 24小时不间断巡查!智能无人机彻底改变传统巡检模式

    24小时不间断巡查!智能无人机彻底改变传统巡检模式

    随着大疆无人机盛行,越来越多的无人机活跃在电力、码头、矿山等多个领域。在电力行业,魁鲸科技已经将无人机投入巡检作业并取得了很好的反响。魁鲸科技很好的将无人机技术结合了巡检、工单系统,利用AI识别技术将巡检和风险检测真正做到了定时、实时检测。 无人机巡检整体上就是利用无人机对需要巡查的目标对象或区域进行无人操作化巡检的技术。通过无人机搭载的传感器,无人机可以将数据实时传回系统控制中心进行处理、分析、预警。随着无人机技术,视觉技术,传感器技术的发展,无人机巡检通过整合多项技术已经可以服务更多的行业,…

  • 上海app开发:内容电商App开发需要具备有哪些功能呢?

    上海app开发:内容电商App开发需要具备有哪些功能呢?

    内容电商App开发随着电商行业的发展,为了更好的吸引用户对于商品的关注,在电商的购物上给用户们更好的体验。为用户们打造内容电商平台,丰富电商的玩法,丰富了用户们在购物上的体验,和提供了更多的选择。同时也为商家们在商品的销售上提供更好的销售的渠道。 内容电商的出现,是传统的电商模式的发展下,根据消费者用户的需求特点,衍生出来的一种电商模式。通过内容吸引用户的关注,然后通过内容带动商品的销售,商家的发展。这个跟短视频电商、社交电商的原理都是一样的。 那内容电商App开发可以有哪些功能呢? 内容资讯:…

    新闻中心 2024年3月14日
  • 上海小程序定制开发公司十大排行榜

    上海小程序定制开发公司十大排行榜

    随着小程序在日常生活中的渗透率不断加深,企业对小程序的开发需求呈现爆发式增长。面对市场上数以万计的开发公司,如何选择一家靠谱的合作伙伴成为企业的一大难题。据统计,目前国内小程序开发公司数量已超过5万家,但其中仅有不到10% 的企业具备成熟的技术框架和高端定制能力。今天,我们就为大家盘点上海小程序定制开发公司的十大排行榜,帮助您的企业精准避坑,找到最合适的开发伙伴。 1、上海魁鲸科技 上海魁鲸科技专注小程序定制开发等多个领域,为500+不同行业的客户提供全面且专业的解决方案。 核心优势:依据企业需…

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

联系我们

400-103-7662

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

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

返回顶部