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开发如何更好的管理在途库存

    【解决方案】跨境电商ERP开发如何更好的管理在途库存

    随着全球化日益加深的今天,跨境电子商务已成为企业拓展国际市场的重要途径。然而,随着业务规模的扩大,跨境贸易中的库存管理,特别是“在途库存”管理,变得尤为复杂和关键。在途库存,即在运输过程中尚未达到目的仓库的商品库存,其有效管理直接关系到企业的资本周转率、客户满意度和市场竞争力。因此,跨境电商ERP在管理在途库存方面扮演着关键角色,有效管理在途库存可以显著提升供应链效率、降低库存成本,并减少缺货和过量库存的风险。以下是一些优化在途库存管理的策略: 实时跟踪和可视化 实时跟踪:通过集成物流跟踪系统,…

  • 上海软件定制公司:建设营销型网站对企业线上获客的重要性

    上海软件定制公司:建设营销型网站对企业线上获客的重要性

    线上获客“方式对”传统获客“方式的加速替代。 经历这次疫情,很多企业才发现“线上获客”能力的重要性。 无论是什么类型的企业,都必须拥有一种从线上获客的能力,传统的获客方式无非是电话、广告、分销等等。 但是这些模式的主动权越来越小,而且成本将越来越高。 线上获客的本质,是靠内容获客,深度一点来讲是靠价值获客。 未来各种线上平台会越来越开放,图文、短视频、音频等各种形式都有,你必须创造出有价值的内容去吸引你的客户。 网站是公司进入线上获客的关键一步,建设了网站就意味着企业要借助互联网促进企业的发展,…

    新闻中心 2024-03-14
  • 连锁餐饮为何更倾向小程序点餐

    连锁餐饮为何更倾向小程序点餐

    在数字化浪潮的推动下,餐饮行业正在经历一场深刻的变革。特别是连锁餐饮企业,它们正逐渐摒弃传统的点餐方式,转而拥抱更为高效、便捷的小程序点餐系统。这一转变不仅改善了顾客体验,也提高了餐厅的运营效率。那么,为什么连锁餐饮更倾向于使用小程序开发的点餐呢?本文将深入探讨小程序点餐的优势所在。 首先,小程序开发点餐极大地提升了点餐的效率。顾客只需通过手机扫描餐桌上的二维码,即可轻松进入点餐界面,选择自己喜欢的菜品并下单。这种方式避免了传统点餐中可能出现的人为错误,如服务员记错订单等,从而确保了订单的准确性…

    新闻中心 2024-11-26
  • 跨境物流平台定制开发介绍-魁鲸科技

    跨境物流平台定制开发介绍-魁鲸科技

    跨境物流平台系统是一种专注于解决国际货物运输和物流管理的综合性解决方案,也是一种跨境电商物流系统。这类平台的目标是简化跨国物流流程,在物流平台定制开发后,提高物流效率,降低成本,以更好地满足全球贸易的需求。以下是跨境物流平台的一般介绍:   【跨境物流系统定制开发项目后台业务功能】 1、用户管理 客户类型需要明确定义,例如直客、同行、加盟商。 注册时的验证码验证机制可以考虑使用短信或邮箱验证。 用户信息同步时需确保数据的安全性和一致性。 2、物流产品管理 产品价格计算需要考虑多种因素,…

    新闻中心 2024-01-10
  • 互联网教育平台的题库、知识库和测评系统:革新学习的引擎

    互联网教育平台的题库、知识库和测评系统:革新学习的引擎

    随着互联网技术的不断发展,互联网教育平台已经成为了现代教育的重要组成部分。其中,题库、知识库和测评系统是关键的元素,它们为学生和教育机构提供了许多优势。本文将探讨互联网教育平台中的这些元素,从行业特性、系统优势以及功能点等各方面展开讨论。 一、行业特性 互联网教育行业具有以下特性: 全球化和无边界性:互联网教育平台能够突破地理界限,学生可以随时随地获取教育资源,跨越国界。 个性化学习:平台可以根据学生的学习需求和水平提供个性化的教育内容,提高学习效率。 多媒体和互动性:通过视频、音频、图像和互动…

    新闻中心 2023-10-09
  • 智慧生活APP项目的有哪些别具一格的特色功能?

    智慧生活APP项目的有哪些别具一格的特色功能?

    随着科技的发展,智能手机和家电设备已经成为人们生活中的必需品,这极大地方便了我们的日常生活,但却给中老年人带来了一些困惑,如:如何使用软件、如何正确使用电器?虽然中老年人也开始频繁地使用这些设备,但他们大多对于新技术的使用方法和操作步骤不太熟悉,容易出现混乱和忘记操作步骤的情况,此时他们又苦于没有子女时时在身旁指导,因此出现了很多不便利的情况。 客户希望设计一款应用程序,子女可以随时随地了解父母的日常生活中的需求和任务,及时为他们提供帮助和支持。如果父母在使用家电设备时遇到困难,子女可以通过应用…

    新闻中心 2024-04-17
  • 医药企业CRM销售管理系统开发主要核心功能有哪些?

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

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

    新闻中心 2024-04-23
  • 定制开发智能无人仓储管理系统多少钱

    定制开发智能无人仓储管理系统多少钱

    随着科学技术的快速发展,智能无人仓储管理系统已成为现代仓储物流领域的热门话题。该系统集成了先进的自动化技术和物联网(IoT)、大数据分析与人工智能(AI)等技术可以显著提高仓储效率,降低人工成本,提高运营管理的准确性。然而,对于许多企业来说,定制和开发一个智能无人仓储管理系统的成本是一个不容忽视的问题。本文将深入探讨定制开发系统的成本组成及其影响因素。 一、系统硬件成本 智能无人仓储管理系统的硬件部分是整个系统的基础,包括自动化设备、机器人、传感器、RFID标签等。这些设备的价格因品牌、性能和技…

  • 工单管理系统-上海魁鲸科技

    工单管理系统-上海魁鲸科技

    在现代企业管理中,工单管理系统(Ticketing Management System)它已经成为一个不可或缺的工具。依据选择合适的系统,企业能够实现智能任务管理,提升服务质量和团结协作效率。核心功能如下: 一、多渠道提单 1、智能助手 通过AI助手自动识别用户需求并生成工单,减少人工操作。 支持自然语言处理,提升交互体验。 2、企业自建IM 与企业内部即时通讯工具(如钉钉、企业微信)集成,直接在聊天中提交工单。 3、服务门户 提供统一的服务入口,用户可通过网页提交工单并查看处理进度。 4、移动…

    新闻中心 2025-03-21
  • 多单位ERP系统开发-上海魁鲸科技

    多单位ERP系统开发-上海魁鲸科技

    ERP系统是企业管理的重要方式之一。随着智能和自动化企业管理的高速发展,ERP系统已成为协助企业管理者经营和管理各种业务的好伙伴,ERP系统中多单位已成为许多企业十分重视的管理方向。一起来看看ERP系统中的多单位是什么。 一、ERP多单位是什么? 多单位是指在同一企业的差异部门或不同需求场景下,对同一产品采用不同数量单位。比如,在制造业中,不同数量单位将用于同一原料的购置、生产和使用,及其仓库库存和计量。因而,在ERP中引入多单位的概念至关重要。 二、多单位管理的适用场景 ERP多单位的应用场景…

    新闻中心 2025-02-10
在线沟通
客服微信
客服微信
在线咨询
联系我们

联系我们

400-103-7662

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

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

返回顶部