springboot整合log4j2

springboot整合log4j2

log4j2相信大家非常常见了,以前基本去了项目每个都有,然后也都直接用,很少有时间研究过它,这不这两天稍微空了点,学习了下,然后写下了这篇文章记录。

本文主要大纲

  • springboot整合log4j2
  • 一. Spring基本配置
  • 二. 一个完整的log4j2.xml文件展示
  • 三. xml文件中重要标签详解
  • 四. level属性的含义和层级关系详解

一. Spring基本配置

1.springboot有个默认的日志框架,首先我们要在Maven依赖中移除它:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>

2.加入log4j2的依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>

3.灵活配置。我们知道springboot的配置,可以用spring.profiles.active去灵活配置开发环境和线上环境,日志配置也有相同的实现方法。
只需要在application.properties中去指定配置的文件名就好

logging.config=classpath:log4j2.xml

所以log4j2.xml的命名可以多个,比如log4j2-dev.xml,log4j2-release.xml等,然后在这里灵活切换。我这里因为就单一环境,所以直接用log4j2.xml。
4.添加一个启动类(启动类命名为了偷懒,就用以前的demo),加入测试代码,就可以进行下一步了。

@SpringBootApplication
public class LeetcodeTestApplication{private static final Logger logger = LoggerFactory.getLogger(LeetcodeTestApplication.class);public static void main(String[] args) {SpringApplication.run(LeetcodeTestApplication.class, args);logger.trace("test:{}",1);logger.debug("test:{}",2);logger.info("test:{}",3);logger.warn("test:{}",4);logger.error("test:{}",5);}
}

二. 一个完整的log4j2.xml文件展示

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--变量配置--><Properties><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="./logs"/><property name="FILE_NAME" value="Log4j2Test"/></Properties><appenders><Console name="Console" target="SYSTEM_OUT"><!-- 日志级别过滤策略 --><Filters><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/></Filters><!--设置日志格式及颜色--><PatternLayoutpattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"disableAnsi="false" noConsoleNoAnsi="false"/></Console><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log"filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log"filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log"filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--><!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效--><loggers><root level="info"><appender-ref ref="Console" level="info"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers></configuration>

运行我们刚刚的测试代码,效果图如下:
在这里插入图片描述

三. xml文件中重要标签详解

  1. <configuration>:整个xml文件最外层的标签,上面常见的属性有两个,<Configuration status=“WARN” monitorInterval=“30”>

    • status:是用于指定log4j的级别,不常用,因为我们会在其它更细致的地方去指定级别。
    • monitorterval:是用于指定log4j自动重新检测读取配置内容的间隔时间,单位为秒(s),最小值为5秒。如果你的项目有自动检测刷新的需求,就把这个参数加上。
  2. <Properties>:属性标签,也可以叫变量标签,在这里定义我们常用的一些变量,比如日志生成目录的地址,一些特殊的前缀名等,可以理解为声明变量,比如int a = 1,然后在后面的内容中去使用变量a。

    • 这个例子就定义了生成日志文件的目录:<property name=“FILE_PATH” value=“./logs”/>,后面用${FILE_PATH}就能获取到这个路径。
  3. <Appenders>:核心区域部分,里面定义了很多Appender去自定义我们的日志内容。

  4. <Console>:Appender的一种,设置控制台的输出,

  5. <Filters>:过滤器,里面常用的就是日志级别过滤标签《ThresholdFilter》,后面的内容会详细讲解level,这里先略过。

  6. <PatternLayout>:Appender中设置输出格式的标签,这里可以设置日期、不同的level输出颜色等。不设置的话,默认为:%m%n

  7. <RollingFile>:我们的线上服务器,查过往日志的时候,都会发现按照年月日很工整的存放起来的,然后里面是个gz压缩文件,这个功能的实现,就是这个标签来控制的。 这个标签的属性

    • name:Appender的名字,每个Appender的通用属性。
    • fileName,要打包的日志文件名。
    • filePattern:打包后的gz文件目录和格式
      例如:<fileName=“${FILE_PATH}/info.log” filePattern=“${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz”>,这样设置的含义就是:将fileName为info.log的文件以特定格式打包到filePattern目录下,如果还不理解的就看看效果图:
      在这里插入图片描收到

    由于本文第二大点的xml文件中设置了info、error、warn三个,所以这里会分别出现三个gz文件。当然我们这里还可以设置文件夹名,让他通过时间来创建不同的文件夹:filePattern=“logs/$${date:yyyy-MM}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_-%i.log.gz”>

    • <Policies>:RollingFile标签的内标签,表述打包写文件的策略,常用的两个设置就是基于日志文件大小的策略和基于时间的策略。注意:压缩完成后将清空当前文件(fileName指定的文件)
    • <SizeBasedTriggeringPolicy size=“20MB”/>:日志先写入logs/info.log中,每当文件大小达到20MB时或经过1天,按照在logs/2024-04/目录下以app-2024-04-23-1.log.gz格式对该日志进行压缩重命名并归档,并生成新的文件info.log进行日志写入
    • <TimeBasedTriggeringPolicy interval=“6” modulate=“true”/>:表示每过6小时,就进行一次当前文件压缩打包并重新生成新文件进行日志写入。
    • <DefaultRolloverStrategy max=“10”/>,和上面filePattern的%i对应类似于整数计数器,当文件个数达到10个的时候会循环覆盖前面已归档的1-10个文件。若不设置该参数,默认为7。
  8. <loggers>:日志系统的根记录器

    • Root:用于指定项目的根日志,level属性表示日志输出级别,子节点AppenderRef用于指定输出到某个Appender,子节点的ref属性也就是前面的RollingFile中指定的name名称,子节点的level也是日志输出级别。2.7版本后,可以换成AsyncRoot去异步处理,不会阻塞应用程序的主线程,提高性能。
    • Logger :用于指定日志的形式,指定不同包的日志级别,level属性表示日志输出级别,name属性用来指定该Logger所适用的类或者类的全路径。子节点AppenderRef用于指定日志输出到哪个Appender,若没有指定,默认集成自Root。
        <loggers><root level="trace"><appender-ref ref="Console" level="trace"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers><Logger name="com.alibaba.cloud.dubbo" level="error"/>
    

    高级扩展,异步日志:使用下面标签需要加入 disruptor依赖。

    • AsyncRoot:<AsyncRoot level=“info” additivity=“false” includeLocation=“true”> ,additivity:需不需要打印此logger继承的父logger,false则只打印当前Logger
    • RollingRandomAccessFile:有缓冲区的RollingFile,性能更好。

四. level属性的含义和层级关系详解

  1. 常用日志级别排序:trace<debug<info<warn<error**

  2. 日志level层级关系
    在目录二中的log4j2.xml文件中,我们可以看到很多地方都在用level字段,到底依哪个为准?下面就将给你说说,按照层级顺序:
    第一:root标签上的level,最高标准(排除configuration),下面的appender-ref标签,如果不指定level的话,默认使用root标签上的level,如果某个日志消息的级别低于此级别,它将被忽略。
    第二:appender-ref标签上的level,它只能设置比root的level高,不然会被忽略。
    第三:ThresholdFilter标签上的level,它只能设置比appender-ref的level高,不然会被忽略。

  3. ThresholdFilter详解:
    (1)属性详解
    onMatch="ACCEPT"匹配该级别及以上级别;
    onMatch="DENY"不匹配该级别及以上级别;

    onMismatch=“ACCEPT” 表示匹配该级别以下的级别;
    onMismatch=“DENY” 表示不匹配该级别以下的级别;
    “NEUTRAL”:中立策略,不讨论。

    (2). 单一应用

    匹配INFO级别以及以上级别,不匹配INFO级别以下级别,即: 匹配 >= INFO的级别

    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    

    不匹配WARN级别以及以上级别,匹配WARN级别以下级别,即: 匹配 < WARN的级别

    <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
    

几个例子总结一下:
1.root的level为error,ppender-ref为info,ThresholdFilter为info,最后只输出error。
2.root的level为info,ppender-ref为warn,ThresholdFilter为info,最后只输出大于等于warn的。
2.root的level为info,ppender-ref为info,ThresholdFilter为warn,最后只输出大于等于warn的。
最后一句话,root最高优先级,appender-ref第二优先级,ThresholdFilter最低优先级。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/651539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony实战开发—进程间通讯

版本&#xff1a;v3.2 Beta5 进程模型 OpenHarmony的进程模型如下图所示&#xff1a; 应用中&#xff08;同一包名&#xff09;的所有UIAbility、ServiceExtensionAbility、DataShareExtensionAbility运行在同一个独立进程中&#xff0c;即图中绿色部分的“Main Process”。…

进口透明可视耐腐蚀PFA进样管特氟龙圆底试管适配MC-ICP-MS

PFA进样管可适配Neptune plus多接收器等离子质谱仪&#xff08;MC-ICP-MS&#xff09;&#xff0c;广泛应用于地球化学、核保障、环境科学、金属组学领域&#xff0c;在生物、物理、化学、材料等多个学科的交叉方向也有良好的应用前景。 外观半透明&#xff0c;便于观察管内情…

.BEAST勒索病毒肆虐:企业和个人如何应对数据加密威胁?

1. .BEAST勒索病毒的介绍&#xff1a; .BEAST勒索病毒是一种恶意软件&#xff0c;它利用加密算法对用户的文件进行加密&#xff0c;并索要赎金以换取解密密钥。如果您的数据承载着企业机密、客户信赖与研发心血&#xff0c;欢迎添加技术服务号&#xff08;safe130&#xff09;以…

uniapp 引用组件后 不起作用 无效果 不显示

根据uniapp官方文档easycom组件规范 只要组件安装在项目的components目录下或uni_modules目录下&#xff0c;并符合components/组件名称/组件名称.(vue|uvue)目录结构&#xff08;注意&#xff1a;当同时存在vue和uvue时&#xff0c;uni-app 项目优先使用 vue 文件&#xff0c;…

ZABBIX API:高效监控的利器

新钛云服已累计为您分享794篇技术干货 ZABBIX是一款广受欢迎的高效监控工具&#xff0c;它提供了一系列丰富的API接口&#xff0c;使得日常监控任务变得更加便捷。无论是查看信息、添加主机、应用监控模板&#xff0c;还是执行删除操作&#xff0c;ZABBIX API都能助您一臂之力&…

信号带宽和上升沿时间

我们在抽取高速信号的S参数时避不开的一个环节是设置仿真带宽&#xff0c;经常听到有人讲要设置基频&#xff08;奈奎斯特频率&#xff09;的4倍or 5倍带宽&#xff0c;如果是这样&#xff0c;就有一个问题&#xff1a;如果是56Gbps的NRZ信号&#xff0c;那仿真带宽真要设置到1…

linux系统-深入学习文件系统与日志分析

目录 一、inode于block inode于block概括inode的内容inode包含文件的元信息用stat命令可以查看某个文件的inode信息Linux系统文件三个主要的时间属性目录文件架构 用户通过文件名打开文件时&#xff0c;系统内部的过程查看inode号码的实操硬盘分区后的结构 &#x1f447;用户访…

【golang学习之旅】Go 的基本数据类型

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 目录 系列文章总览布尔型&#xff08;bool&#xff09;字符串型&#xff08;string&#xff09;整数型&#xff08;int、uint、byte、rune&#xff09;浮点型&#xff08;float32、float64&#xff09;复…

【我的Java学习笔记-3】

运算符和表达式 运算符&#xff1a; 对字面量或者变量进行操作的符号。 表达式&#xff1a; 用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。 举例说明&#xff1a; int a10; int b 20; int c a b; …

软件测试报告的用途

软件测试报告的用途十分广泛&#xff0c;主要体现在以下几个方面&#xff1a; 评估软件质量&#xff1a;软件测试报告是对软件进行全面、系统测试后的总结&#xff0c;通过报告中的各项数据和结果&#xff0c;可以评估软件的质量水平&#xff0c;包括功能的完整性、性能的稳定…

linux-进程(2)

1.通过系统调用获取进程标示符 进程id&#xff08;PID&#xff09; 父进程id&#xff08;PPID&#xff09; 每一个可执行程序运行起来之后都会成为一个进程&#xff0c;每个进程都有一个自己的id&#xff0c;以及一个父进程id&#xff0c;父进程就是创建自己进程的进程&#xf…

SCI一区级 | Matlab实现BES-CNN-GRU-Mutilhead-Attention多变量时间序列预测

SCI一区级 | Matlab实现BES-CNN-GRU-Mutilhead-Attention秃鹰算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测 目录 SCI一区级 | Matlab实现BES-CNN-GRU-Mutilhead-Attention秃鹰算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测预测效果基本介绍…