spring6启用Log4j2日志

news/2024/9/29 0:06:20/

pom文件

<!--log4j2的依赖-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.23.1</version>
</dependency>

log4j2.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration><loggers><root level="DEBUG"><appender-ref ref="spring6log"/></root></loggers><appenders><console name="spring6log" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger-{1024} - %msg%n"/></console></appenders>
</configuration>

pattern定义日志输出格式:

配置 说明

%d{HH:mm:ss.SSS} 输出日志打印的时间,精确到毫秒

[%t] 输出当前线程名称

%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,不足在右边补空格

%logger{36} 输出logger名称,一般是类的全限定路径名

%msg 输出要打印的业务日志信息

%n 日志换行

实际会输出如下日志:

11:33:08.438 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log

Log4j2共有8种日志级别,

按照优先级从小到大排序:

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error"><!--properties--><properties><!-- 运行日志位置--><property name="LOG_HOME">logs</property><!-- info日志滚动仓库--><property name="LOG_REPO">logs/%d{yyyy-MM-dd}</property><!-- 错误日志滚动仓库--><property name="WARN_REPO">logs/error</property><!--日志格式--><property name="LOG_PATTERN">%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n</property><!--文件过期时间--><property name="LOG_EXPIRE">15d</property><!--单文件大小--><property name="LOG_SIZE">100MB</property></properties><!--appenders --><appenders><!--控制台输出配置 --><Console name="Console" target="SYSTEM_OUT"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><!--输出日志的格式 --><PatternLayout pattern="${LOG_PATTERN}"/></Console><!--打印出所有的info信息,每小时滚动一次,单文件最大100M,文件最多保留15天 --><RollingFile name="InfoFile" fileName="${LOG_HOME}/game.log"filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log"><Filters><ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /></Filters><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--每小时滚动一次,单文件最大100M--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="${LOG_SIZE}"/></Policies><DefaultRolloverStrategy max="10"><!-- 每个文件最长保留时长=>15天--><Delete basePath="logs/" maxDepth="2"><IfFileName regex=".*log" /><IfLastModified age="${LOG_EXPIRE}" /></Delete></DefaultRolloverStrategy></RollingFile><!--打印出所有的warn/error信息,单文件最大100M后滚动,文件最多保留15天 --><RollingFile name="WarnFile" fileName="${LOG_HOME}/game.warn.log"filePattern="${WARN_REPO}/game.%d{yyyy-MM-dd}.%i.log"><Filters><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/></Filters><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--单文件最大100M--><SizeBasedTriggeringPolicy size="${LOG_SIZE}"/></Policies><DefaultRolloverStrategy><!-- 每个文件最长保留时长=>15天--><Delete basePath="logs/" maxDepth="2"><IfFileName regex=".*log" /><IfLastModified age="${LOG_EXPIRE}" /></Delete></DefaultRolloverStrategy></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 --><loggers><!--运行日志--><logger name="com.msgame" additivity="false"><level value="INFO"/><appenderRef ref="InfoFile"/><appenderRef ref="WarnFile"/><appenderRef ref="Console"/></logger><!--默认日志 --><root level="info"><appender-ref ref="InfoFile"/></root></loggers>
</configuration>

测试代码

package org.apache.logging.log4j;public class Log4j2Test {private static Logger LOG = LogManager.getLogger(Log4j2Test.class);public static void main(String[] args) throws Exception {// 一直打印日志,用于测试Log4j2功能while (true) {logAll();}}// 打印各种级别的日志用于测试public static void logAll() throws Exception {LOG.trace("trace level log");LOG.debug("debug level log");LOG.info("info level log");LOG.error("error level log");LOG.fatal("fatal level log");// 设置休眠时间(单位ms),控制日志打印速度Thread.sleep(3);}
}


http://www.ppmy.cn/news/1531670.html

相关文章

C++入门编程题(力扣):字符串中最多数目的子序列

1.题目描述&#xff1a; 给你一个下标从0开始的字符串 text 和另一个下标从0开始且长度为 2 的字符串 pattern两者都只包含小写英文字母。 你可以在 text 中任意位置插入 一个 字符&#xff0c;这个插入的字符必须是 pattern[0]或者 pattern[1]。 注意&#xff0c;这个字符可以…

Spring Boot 基础入门指南

1. 什么是 Spring Boot&#xff1f; Spring Boot 是一个用于简化 Spring 应用程序开发的框架&#xff0c;旨在让开发者快速构建独立的、生产级的 Spring 应用。它提供了自动配置、嵌入式服务器和一系列开箱即用的功能&#xff0c;降低了应用程序的开发和部署难度。 2. Spring…

青动CRM V3.2.1

全面解决企业销售团队的全流程客户服务难题旨在助力企业销售全流程精细化、数字化管理&#xff0c;全面解决企业销售团队的全流程客户服务难题&#xff0c;帮助企业有效盘活客户资源、量化销售行为&#xff0c;合理配置资源、建立科学销售体系&#xff0c;提升销售业绩。标准授…

Spring MVC常用注解(绝对经典)

文章目录 一、元注解1.1 Target&#xff1a;1.2 Retention&#xff1a; 二、常见注解2.1 Controller&#xff1a;2.2 SpringBootApplication&#xff1a;2.3 RequestMapping&#xff1a;2.4 RequestParam&#xff1a;2.5 PathVariable&#xff1a;2.6 RequestPart&#xff1a;2…

【数据库】sqlite

文章目录 1. 基本概述2. 主要特点3. 应用场景4. 优缺点5. 基本使用示例6. 在编程语言中的使用连接到 SQLite 数据库&#xff08;如果文件不存在会自动创建&#xff09;创建表插入数据提交事务查询数据关闭连接 7. 总结 SQLite 是一个轻量级的关系型数据库管理系统&#xff08;R…

py-mmcif 包entity_poly 对象介绍

在 py-mmcif 包中,entity_poly 对象和 pdbx_poly_seq_scheme 对象都与生物大分子(如蛋白质和核酸)的序列和结构信息相关,但它们的目的和包含的信息有所不同。以下是它们之间的区别和联系: 1. 对象定义与结构 entity_poly 对象: 用于描述生物大分子的聚合体(如多肽或核酸…

Netty--第三章

Netty 进阶 1. 粘包与半包 1.1 粘包现象 服务端代码 public class HelloWorldServer { static final Logger log LoggerFactory.getLogger(HelloWorldServer.class); void start() { NioEventLoopGroup boss new NioEventLoopGroup(1); NioEventLoopGroup worker new Nio…

Stream流将List转换成Map

一、前言 通常会需要使用到对象和Map互相转换的开发场景,下面这篇文章主要给大家介绍了关于java对象list使用stream根据某一个属性转换成map的3种方式,需要的朋友可以参考下。 二、将List转换为Map&#xff0c;键为某个属性&#xff0c;值为对象本身 List<User> userL…