集成Log4j2以及异步日志

ops/2025/1/12 3:49:16/

文章目录

    • 1.环境搭建
        • 1.在sunrays-common下创建一个单独的模块
        • 2.依赖关系
          • 1.继承父模块的版本和通用依赖
        • 3.创建自动配置相关
          • 1.目录
          • 2.pom.xml
          • 3.Log4j2AutoConfiguration.java 自动配置类
          • 4.META-INF/spring.factories 指定自动配置类
    • 2.集成Log4j2以及异步日志
        • 1.目录
        • 2.引入依赖
        • 3.log4j2.xml
        • 4.log4j2.component.properties 开启全局异步日志
        • 5.maven下载到本地仓库
    • 3.测试
        • 1.创建一个demo模块
        • 2.目录
        • 3.pom.xml 引入自定义的log4j2模块
        • 3.启动类
        • 4.Log4j2Test.java 测试
        • 5.测试结果
          • 1.控制台
          • 2.日志输出位置

1.环境搭建

1.在sunrays-common下创建一个单独的模块

CleanShot 2024-10-24 at 10.31.46@2x

2.依赖关系
1.继承父模块的版本和通用依赖

CleanShot 2024-10-24 at 17.02.54@2x

3.创建自动配置相关
1.目录

2.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.sunxiansheng</groupId><artifactId>sunrays-common</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>common-log4j2-starter</artifactId><dependencies><!-- SpringBoot自动配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency></dependencies></project>
3.Log4j2AutoConfiguration.java 自动配置类
package com.sunxiansheng.log4j2.config;import org.springframework.context.annotation.Configuration;/*** Description: Log4j2自动配置类** @Author sun* @Create 2024/10/24 10:36* @Version 1.0*/
@Configuration
public class Log4j2AutoConfiguration {
}
4.META-INF/spring.factories 指定自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunxiansheng.log4j2.config.Log4j2AutoConfiguration

2.集成Log4j2以及异步日志

1.目录

2.引入依赖
<!-- log4j2日志 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 异步日志 -->
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version>
</dependency>
log4j2xml_95">3.log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Log4j2 配置的根元素 -->
<Configuration status="INFO" monitorInterval="30"><!--status="INFO":设置 Log4j2 内部日志的输出级别为 INFO,用于调试配置问题。monitorInterval="30":Log4j2 将每 30 秒检查一次配置文件的变化,实现热加载配置。--><!-- 定义全局属性,可在整个配置文件中使用 --><Properties><!-- 日志文件存储的根目录 --><Property name="LOG_HOME">./logs</Property><!-- 日志文件的名称前缀 --><Property name="LOG_NAME">sunrays-framework</Property><!-- 控制台日志输出格式,带颜色 --><Property name="CONSOLE_LOG_PATTERN">%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{green} %style{[%t]}{blue} %highlight{%p}{STYLE=LOGBACK} %style{[PFTID:%X{PFTID}]}{magenta} %style{%logger{36}}{cyan} - %msg%n%throwable</Property><!-- 文件日志输出格式,不带颜色 --><Property name="FILE_LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p [PFTID:%X{PFTID}] %logger{36} - %msg%n%throwable</Property></Properties><!-- 定义日志输出目的地(Appender) --><Appenders><!-- 控制台输出 --><Console name="Console" target="SYSTEM_OUT"><!-- 使用带颜色的布局模式 --><PatternLayout pattern="${CONSOLE_LOG_PATTERN}"/><!-- 设置日志级别过滤器,只允许 INFO 及以上级别 --><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/></Console><!-- INFO 级别日志文件输出 --><RollingFile name="InfoFile"fileName="${LOG_HOME}/unarchived/info/${date:yyyy-MM-dd}/current.log"filePattern="${LOG_HOME}/archived/info/${date:yyyy-MM-dd}/${LOG_NAME}-info-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz"><!-- 使用不带颜色的布局模式 --><PatternLayout pattern="${FILE_LOG_PATTERN}"/><Policies><!-- 使用 Cron 表达式,每2小时归档一次 --><CronTriggeringPolicy schedule="0 0 0/2 * * ?"/><!-- 文件大小超过 50MB 时归档 --><SizeBasedTriggeringPolicy size="50MB"/></Policies><DefaultRolloverStrategy><!-- 删除超过7天的归档日志 --><Delete basePath="${LOG_HOME}/archived/info" maxDepth="2"><IfFileName glob="*.log.gz"/>                        <!-- 匹配 .log.gz 的文件 --><IfLastModified age="7d"/>                           <!-- 文件修改时间超过7天 --></Delete></DefaultRolloverStrategy><Filters><!-- 只接受 INFO 及以上级别的日志 --><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/></Filters></RollingFile><!-- WARN 级别日志文件输出 --><RollingFile name="WarnFile"fileName="${LOG_HOME}/unarchived/warn/${date:yyyy-MM-dd}/current.log"filePattern="${LOG_HOME}/archived/warn/${date:yyyy-MM-dd}/${LOG_NAME}-warn-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz"><PatternLayout pattern="${FILE_LOG_PATTERN}"/><Policies><CronTriggeringPolicy schedule="0 0 0/2 * * ?"/><SizeBasedTriggeringPolicy size="50MB"/></Policies><DefaultRolloverStrategy><Delete basePath="${LOG_HOME}/archived/warn" maxDepth="2"><IfFileName glob="*.log.gz"/><IfLastModified age="7d"/></Delete></DefaultRolloverStrategy><Filters><!-- 只接受 WARN 及以上级别的日志 --><ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/></Filters></RollingFile><!-- ERROR 级别日志文件输出 --><RollingFile name="ErrorFile"fileName="${LOG_HOME}/unarchived/error/${date:yyyy-MM-dd}/current.log"filePattern="${LOG_HOME}/archived/error/${date:yyyy-MM-dd}/${LOG_NAME}-error-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz"><PatternLayout pattern="${FILE_LOG_PATTERN}"/><Policies><CronTriggeringPolicy schedule="0 0 0/2 * * ?"/><SizeBasedTriggeringPolicy size="50MB"/></Policies><DefaultRolloverStrategy><Delete basePath="${LOG_HOME}/archived/error" maxDepth="2"><IfFileName glob="*.log.gz"/><IfLastModified age="7d"/></Delete></DefaultRolloverStrategy><Filters><!-- 只接受 ERROR 及以上级别的日志 --><ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/></Filters></RollingFile><!-- 全部级别日志文件输出(包含 DEBUG 及以上) --><RollingFile name="AllFile"fileName="${LOG_HOME}/unarchived/all/${date:yyyy-MM-dd}/current.log"filePattern="${LOG_HOME}/archived/all/${date:yyyy-MM-dd}/${LOG_NAME}-all-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz"><PatternLayout pattern="${FILE_LOG_PATTERN}"/><Policies><CronTriggeringPolicy schedule="0 0 0/2 * * ?"/><SizeBasedTriggeringPolicy size="50MB"/></Policies><DefaultRolloverStrategy><Delete basePath="${LOG_HOME}/archived/all" maxDepth="2"><IfFileName glob="*.log.gz"/><IfLastModified age="7d"/></Delete></DefaultRolloverStrategy><!-- 不添加 ThresholdFilter,接受所有级别的日志 --></RollingFile></Appenders><!-- 配置日志记录器(Logger),定义日志的输出规则和级别 --><Loggers><!--以下是针对特定模块的日志配置,目前被注释掉了。可以根据需要取消注释,定制化模块的日志级别和输出。--><!-- 配置指定模块的异步日志 --><!--<AsyncLogger name="com.sunxiansheng" level="DEBUG" additivity="false" includeLocation="false"><AppenderRef ref="Console"/></AsyncLogger>--><!--name="com.sunxiansheng":指定包名或类名,针对该模块进行配置。level="DEBUG":设置日志级别为 DEBUG,记录 DEBUG 及以上级别的日志。additivity="false":不向父 Logger 传递,防止日志重复输出。includeLocation="false":不包含代码位置信息,提高性能。<AppenderRef ref="Console"/>:将日志输出到 Console Appender。--><!-- 配置其他特定模块的日志 --><!--<Logger name="com.moduleA" level="INFO" additivity="false"><AppenderRef ref="Console"/></Logger>--><!--针对 com.moduleA 包,设置日志级别为 INFO,日志只输出到 Console,不向上级传播。--><!-- 根日志记录器,处理未被其他 Logger 捕获的日志 --><Root level="DEBUG"><!-- 引用之前定义的所有 Appender --><AppenderRef ref="Console"/><AppenderRef ref="InfoFile"/><AppenderRef ref="WarnFile"/><AppenderRef ref="ErrorFile"/><AppenderRef ref="AllFile"/></Root><!--level="DEBUG":设置根日志级别为 DEBUG,记录 DEBUG 及以上级别的日志。所有未被特定 Logger 处理的日志,都会按照根日志器的配置输出。--></Loggers>
</Configuration>
log4j2componentproperties__268">4.log4j2.component.properties 开启全局异步日志
# 开启全局异步日志
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
5.maven下载到本地仓库

clean-install

3.测试

1.创建一个demo模块

CleanShot 2024-10-24 at 17.16.48@2x

2.目录

CleanShot 2024-10-24 at 17.25.18@2x

log4j2_289">3.pom.xml 引入自定义的log4j2模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.sunxiansheng</groupId><artifactId>sunrays-demo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>common-log4j2-starter-demo</artifactId><dependencies><!-- common-log4j2-starter --><dependency><groupId>com.sunxiansheng</groupId><artifactId>common-log4j2-starter</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><!-- 排除掉logging --><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency></dependencies>
</project>
3.启动类
package com.sunxiansheng.log4j2;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Description:** @Author sun* @Create 2024/10/24 17:22* @Version 1.0*/
@SpringBootApplication
public class Log4j2Application {public static void main(String[] args) {SpringApplication.run(Log4j2Application.class, args);}
}
4.Log4j2Test.java 测试
package com.sunxiansheng.log4j2;import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.async.AsyncLoggerContext;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;/*** Description:** @Author sun* @Create 2024/10/24 17:20* @Version 1.0*/
@SpringBootTest
@Slf4j
public class Log4j2Test {@Testpublic void test() {log.info("info");log.warn("warn");log.error("error");// 输出当前的工作目录System.out.println("Current Working Directory: " + System.getProperty("user.dir"));// 测试是否是异步模式if (LogManager.getContext(false) instanceof AsyncLoggerContext) {// 异步模式System.out.println("Log4j2 is running in asynchronous mode.");} else {// 同步模式System.out.println("Log4j2 is running in synchronous mode.");}}
}
5.测试结果
1.控制台

CleanShot 2024-10-24 at 17.26.45@2x

2.日志输出位置

CleanShot 2024-10-24 at 17.27.55@2x


http://www.ppmy.cn/ops/149338.html

相关文章

(五)ROS通信编程——参数服务器

前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享&#xff08;P2P&#xff09;。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据&#xff0c;关…

【JVM】总结篇之GC日志分析 和 案例

文章目录 GC日志参数GC日志格式GC日志分类MinorGCFullGC 文件概念 OOMOOM案例1&#xff1a;堆溢出OOM案例2&#xff1a;元空间溢出OOM案例3&#xff1a;GC overhead limit exceededOOM案例4&#xff1a;线程溢出 GC日志参数 GC日志格式 GC日志分类 MinorGC MinorGC(或young …

探索微软 M365 安全:全方位守护数字世界

在当今这个科技呈井喷式飞速发展,数字化浪潮以汹涌澎湃、锐不可当之势席卷全球的时代,企业与个人仿若置身于一片浩瀚无垠、信息奔涌的海洋之中,尽情畅享着技术革新所带来的无穷无尽便利。然而,恰如平静海面下潜藏着暗礁与汹涌暗流,网络安全问题恰似隐匿在暗处、随时可能给…

trf 4.10安装与使用-生信工具42

01 背景 DNA 中的串联重复&#xff08;Tandem Repeat&#xff09;指的是两个或多个相邻且近似的核苷酸模式的拷贝。Tandem Repeats Finder (TRF) 是一个程序&#xff0c;用于定位并显示 DNA 序列中的串联重复。用户只需提交一个以 FASTA 格式编写的序列&#xff0c;无需指定重…

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…

Linux第一个系统程序---进度条

进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念&#xff0c;我们用一张图来简单的理解一下&#xff1a; 在计算机语言当中&#xff1a; 换行符&#xff1a;\n 回车符&#xff1a;\r \r\n&#xff1a;回车换行 这时候有人可能会有疑问&#xff1a;我在学习C…

微信小程序防止重复点击事件

直接写在app.wpy里面&#xff0c;全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…

Saas数据库迁移单租户数据

1、背景 租户使用Saas系统&#xff0c;用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库&#xff0c;且数据库数据量太大&#xff0c;需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库&#xff0c;主要使用INFORMATION_SCHEMA.COLUMNS表进行数据…