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、优化用户体验 优化用户体验,提供方便、智能的充电服务,包括实时查询充电桩状…

    新闻中心 2024-10-28
  • 选择移动定制APP的五大理由

    选择移动定制APP的五大理由

    在当今的数字时代,移动应用程序已经成为企业与用户之间的桥梁。许多企业正在权衡是选择定制移动应用程序还是使用市场上现成的产品。在此,我们将讨论选择移动定制应用程序的五个原因:改善品牌形象、优化用户体验、确保数据安全、易于集成和扩展以及长期成本效益。 1. 提升品牌形象 移动定制应用程序可以充分反映企业品牌的特点和价值,提供独特的用户体验。通过定制的设计和功能,定制应用程序可以提高用户对品牌的认知和忠诚度。相比之下,通用应用程序可能不能完全满足品牌的具体需求,甚至可能导致品牌形象的稀释。 2. 优化…

  • 生产制造erp系统管理软件有哪些?

    选型复盘:为中型机械厂推荐ERP,我们最终这样决策 最近帮一家年产值约2亿的中型机械厂做ERP选型,过程很有代表性。老板最初的问题和很多制造企业主一样:“市面上的生产制造ERP系统有哪些?我们该选哪个?” 这问题看似简单,背后却需要对企业自身情况和市场格局的清晰判断。 根据2025年的市场数据,中国制造业ERP市场竞争激烈,头部厂商的市场份额和技术路线已非常明确。简单罗列名字意义不大,关键在于如何匹配。我们的筛选主要聚焦在两类厂商:一是以鼎捷数智、用友、金蝶为代表的深度本土化服务商,二是在特定领…

  • 医药企业CRM销售管理系统开发主要核心功能有哪些?

    医药企业CRM销售管理系统开发主要核心功能有哪些?

    医药企业CRM销售业务管理系统的建设采用了当今最为流行的B/S结构,系统整体部署与企业的内部局域网中,互联网用户如果需要进行系统的访问,则需要使用拨号的方式来进行,通过这种方式来保证系统的安全性. 系统在建设时,采用了立足免费开源中间件,保证系统高可用的建设思路,大量使用了开源软件,在系统的数据库选型过程中,经过充分的测试,最终选择了免费开源的Mysql数据库,在应用服务器选择上,选择了免费使用,但收费进行服务支持的JBOSS应用服务器,通过这种方式,建设了医药企业CRM销售业务管理。 医药企业…

    新闻中心 2024-04-23
  • 智慧园区一体化管理平台开发详解

    智慧园区一体化管理平台开发详解

    智慧园区一体化管理平台是一种集成化、智能化的园区管理系统,旨在提高园区的运营效率、安全性和环境质量。该平台通过整合各种资源和技术,为园区管理者和用户提供全方位的服务。通过开发需求分析我们可以详细了解到园区一体化管理平台主要的核心功能包括了智能安防系统、环境监测、停车管理、数据分析与决策、综合管理、智慧物流等。 智慧园区管理平台开发的核心功能: 1、智能安防系统:通过视频监控、门禁系统、入侵报警等子系统,实现对园区的全面安全监控和防范。2、能源管理:实时监测园区的能源消耗情况,包括用电、用水、用气…

  • 停车场智能系统精准导航 告别停车老总操作·老大难问题

    停车场智能系统精准导航 告别停车老总操作·老大难问题

    在繁忙的城市生活中,驾驶者们常常会遇到一个共同的难题——停车难。尤其是在某些商业中心或高楼大厦的地下停车场,兜兜转转寻找车位,甚至为了找车而“团团转”,这无疑是一种令人沮丧的体验。不过,随着技术的发展,这一难题已经有了解决之道。那就是我们今天要讨论的主题——停车场智能系统精准导航。 一、智能停车系统的背景与发展 随着汽车保有量的迅猛增长和城市化进程的加快,停车难的问题日益突出。传统的停车场管理方式已经无法满足现代化城市的需求。车主们急需一种更加高效、智能化的停车解决方案。智能停车场系统应运而生,…

    新闻中心 2024-12-24
  • 智慧餐厅餐饮管理系统技术方案

    智慧餐厅餐饮管理系统技术方案

    智慧餐厅餐饮管理软件就是行业中常提到的餐厅餐饮管理系统,在现在智慧化软件管理系统普及的当下各类型的智慧餐厅餐饮管理软件系统也层出不穷。从本质上来讲餐厅餐饮软件是一种专门为餐饮业设计的软件系统,旨在帮助餐厅管理者更好地管理餐厅的各项业务,提高工作效率,提升客户体验。这种软件涵盖了许多功能,包括订单管理、库存管理、员工管理、财务管理、客户关系管理等。通过使用餐饮软件定制开发的服务,餐厅管理者可以更好地掌控餐厅的运营情况,实现更有效的管理。同时,顾客也可以通过餐饮软件系统进行点餐、下单、在线客服等操作…

    新闻中心 2024-01-13
  • 魁鲸科技AI数智化平台:大模型+小模型+智能体,让业务全程数智化运营!

    魁鲸科技AI数智化平台:大模型+小模型+智能体,让业务全程数智化运营!

    数字化转型早已不是“做不做”的问题,而是“怎么做”才能既快又稳、既准又省。当下最火的大模型、智能体,究竟如何真正融入企业血脉,驱动业务全程数智化运营?今天,魁鲸科技带来了清晰的答案。 魁鲸科技AI数智化平台:大模型+小模型+智能体,大模型做“大脑”,小模型做“手脚”,智能体做“躯干”,三者协同,让企业从“人盯着屏幕”变成“机器盯着业务”,从“能用”到“好用”再到“全程智跑”。 01 告别单点尝试,迎接全程智跑 许多企业已经开始了AI的局部尝试——智能客服、文案生成、报表分析……但碎片化的AI能力…

    新闻中心 2026-07-02
  • 如何通过资产管理系统提升企业效率?降本增效的智能资产管理解决方案

    如何通过资产管理系统提升企业效率?降本增效的智能资产管理解决方案

    从“账本管理”到“数字运营”:智能资产管理系统如何重塑企业效率 茂名石化的资产盘点从耗时费力变为“一键完成”,管理效率提升约80%,而重庆的“国资智管”系统已将1901户国企纳入实时穿透式监管体系。 曾经让企业管理者头疼的资产盘点,正在变成一件简单高效的工作。茂名石化信息化团队今年新上线的监控系统,让资产盘点实现了“一键完成”,管理效率提升了约80%,资产利用率提高了约60%。 这不仅是单个企业的成功转型,更是当前中国企业资产管理变革的缩影。2024年,中国资产管理总规模达165.45万亿元,过…

    新闻中心 2026-01-27
  • 数字化转型下的外贸业务管理系统:提升效率与竞争力

    数字化转型下的外贸业务管理系统:提升效率与竞争力

    随着全球化的不断发展,国际贸易已经成为许多国家经济增长的重要推动力。外贸企业面临的挑战越来越复杂,需要高效的管理工具来应对。现代外贸管理系统成为了外贸企业不可或缺的一部分,它的重要性愈发显著。本文将讨论现代外贸管理系统的特点以及为什么它对外贸企业如此重要。 1. 特点 a. 自动化与集成 现代外贸管理系统具有强大的自动化功能,能够自动化执行一系列任务,如订单处理、库存管理、发货跟踪、财务管理等。这种自动化大大提高了生产效率,减少了人工错误,使外贸企业能够更快速地响应客户需求。 此外,外贸管理系统…

    新闻中心 2023-10-16
在线咨询
客服微信
客服微信
获取方案/报价
联系我们

联系我们

400-103-7662

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

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

返回顶部