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

 

相关新闻

  • erp和oa有什么区别?哪个更好用一点?

    erp和oa有什么区别?哪个更好用一点?

    erp和oa有什么区别?哪个更好用一点?很多老板会有这样的疑惑,因为市面上一部分企业在用erp系统,一部分企业在用oa系统。其实这个要看公司的实际业务的,接下来福州管家婆软件销售服务中心就给大家详细介绍一下。 一、erp和oa的定义 erp:erp是一种综合性的企业资源管理软件,更注重的是整合企业的业务、数据、资源、财务以及生产等方面,比较适用于具有复杂性的业务企业使用。 oa:oa是一种协同化的办公流程软件,协助各部门更快、更高效的完成数据共享、流程管理、审批管理等,适用于轻量化的企业使用。 二、erp和o…

    FAQ 2025-04-15
  • O2O商城系统开发可以实现哪些功能

    O2O商城系统开发可以实现哪些功能

          O2O(Online To Offline)商城系统开发是一种将线上的购物便利与线下的实体体验结合起来的商业模式,旨在通过互联网技术创新来提升传统零售行业的服务质量和效率。 这种模式对于现代电商行业来说具有重要的战略意义,因为它不仅能够提高消费者的购物体验,还能为商家带来更多的营业机会和收入。以下是O2O商城系统开发的几个关键点的细化和拓展: 1. 同城购物 多样化配送选项:O2O商城系统通过提供到店自提、商家配送和平台配送等多种配送方式,极大地增加了消费者的便利性。这种灵活的配送体…

    新闻中心 2024-02-22
  • 定制化app开发相对于传统app开发具有哪些优势?

    定制化app开发相对于传统app开发具有哪些优势?

    得益于互联网的发展,越来越多的企业开始重视自己的数字化建设。APP开发是最常见的一种。在开发App的时候,很多人经常会面临一个头疼的问题,那就是到底是选择定制开发还是模板开发。相比较下来,APP定制开发更个性化,功能更多,各方面都更优越。 但模板开发的开发周期短,开发价格低,成为很多人的不二选择。但从行业整体数据来看,选择定制化开发的人群比例较大。那么,为什么这么多人更倾向于定制化开发呢?今天福州管家婆软件销售服务中心就问为大家简单分析下。 App定制开发有什么优势? 1.定制APP开发针对性强: 定制化开发Ap…

    新闻中心 2023-02-15
  • 企业开发小程序有什么意义

    企业开发小程序有什么意义

    在当今数字时代,小程序作为移动互联网的重要入口之一,以其独特的优势深刻影响着企业的运营模式和用户体验。企业开发小程序不仅是对市场趋势的积极响应,也是提高品牌竞争力、优化服务流程、增强用户粘性的关键措施。以下是企业开发小程序的一些重要意义。 1. 降低顾客获取成本,拓宽营销渠道 与传统应用程序相比,小程序可以在不下载和安装的情况下使用,大大降低了用户的门槛。企业可以通过微信、支付宝等平台的巨大流量入口轻松接触潜在用户,实现精准营销。同时,小程序内置的共享功能鼓励用户自发传播,形成裂变传播效果,有效…

  • 软件和信息技术服务业市场动向观察

    软件和信息技术服务业市场动向观察

    软件和信息技术服务业市场范围很大,其中包含了软件开发以及信息系统及运维、电子电路、存储支持等信息技术相关的系列服务,根据2024年1月25日国家工业和信息化部发布的2023年全国软件和信息技术服务业数据情况显示,2023年我国软件业务收入合计123258亿元,其中软件产品收入29030亿元,而软件业利润总额为14591亿元,可以看出,我国软件和信息技术服务业运行良好,盈利能力保持稳定。 随着全球信息技术的迅猛发展,软件和信息技术服务业已经逐渐成为推动经济发展、提升国家竞争力的因素。可以说,近年来…

    新闻中心 2024-01-25
  • HRM和HRD是什么意思

    HRM和HRD是什么意思

    在当今以人才为核心竞争力的商业环境中,人力资源(HR)职能已从传统的事务管理,演变为驱动组织战略与发展的关键引擎。HRD与HRM作为这一体系中的核心概念,其内涵的深度理解与有效整合,直接关乎组织的人才效能与可持续竞争力。 HRM:构建稳健的人才管理体系基石 人力资源管理(HRM)是确保组织人力资源有效配置与合规运营的基础框架。其核心在于通过系统化、流程化的管理,将“人”这一资源进行合理规划与利用,以实现组织短期目标。 ➭ 核心职能:其工作聚焦于招聘与配置、薪酬福利、绩效管理、劳动关系与合规等模块…

  • ERP智慧餐饮管理系统

    ERP智慧餐饮管理系统

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

    新闻中心 2024-09-09
  • 软件开发定制需要多长时间

    软件开发定制需要多长时间

    在当今数字化迅速发展的时代,软件开发定制已成为企业实现业务创新、提升竞争力的关键途径,越来越多的企业意识到定制软件的重要性,以满足特定的业务需求。然而,许多企业在考虑定制软件开发时,由于受到诸多因素的影响,常常会面临一个关键问题:软件开发定制需要多长时间?这个项目需要多长时间才能完成?今天福州管家婆软件销售服务中心小编就带你解惑一下。 一、定制软件开发的定义定制软件开发,顾名思义,是指根据特定客户或组织的具体需求和目标,开发特别设计的软件。与市面上的通用软件不同,这种开发模式强调个性化、精准的业务匹配和高度灵活性,以…

    关于我们 2024-07-22
  • 管家婆进销存管理系统多少钱一年

    管家婆进销存管理系统多少钱一年

    最近与一位经营家居建材的客户交流,他的公司年营收约800万,正处于从手工记账向数字化管理转型的关键阶段。他最迫切的问题很具体:“像我们这样的规模,上一套管家婆系统,一年到底要准备多少预算?” 这个问题背后,关乎的不仅是软件价格,更是企业对管理效率提升的预期投资。 管家婆进销存系统的费用并非一个固定数字,其年费范围大致在1380元至12000元之间,差异主要取决于企业选择的版本、用户数和功能模块。对于大多数初创或小微企业,满足基本进销存管理的基础版年费通常在2000-3000元区间。当业务扩展到需…

  • 想要定制开发手机APP?那么这四点你一定要清楚!

    想要定制开发手机APP?那么这四点你一定要清楚!

    自移动互联网迅速发展以来,越来越多的个人及企业认识到手机APP的市场潜力,并热衷于且开发APP,通过一定的运营去获得盈利。不过,要想做一款被大众所经常使用,具备一定市场份额的APP,那么,在定制开发APP时,就既要让所做APP符合市场的需求,也更要重视用户体验,如此才有可能打造一款成功的APP。 因此,在产品定位到开发运营的过程中,需要需求方的产品负责人与APP开发公司产品经理一起协作完成,而不是简单的功能开发完成就可以。下面上海福州管家婆软件销售服务中心为您分享一下手机APP定制开发时需要做到的几点。 一、明确了解…

    新闻中心 2024-03-11
在线沟通
客服微信
客服微信
在线咨询
联系我们

联系我们

400-103-7662

售前咨询邮箱:
[email protected]

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

返回顶部