项目中如何配置和使用Log4j2.x

SLF4J

SLF4J(Simple Logging Facade for Java)是一个简单的 Java 日志门面,用于统一日志系统的接口。它提供了一个抽象层,允许应用程序以统一的方式记录日志,而无需关心底层的日志实现。 在实际项目中我们一般使用这个抽象层,底层对接具体的日志框架。本文的目的是为了快速跑起来,实现一个简单的日志demo。

Log4j2 和 SLF4j 绑定

为了使 Log4j2 与 SLF4J 一起工作,我们需要包含以下 4 个依赖项。

  • slf4j-api.jar -- SLF4J 提供了一个统一的日志接口,包括 Logger、LoggerFactory、Marker 等,使得应用程序能够通过这些接口来进行日志记录。
  • log4j-slf4j-impl.jar -- Log4j2和SLF4J 绑定。它充当 SLF4J接口和Log4j2实现之间的适配器,log4j-slf4j-impl 模块提供了 SLF4J 的一个实现,使得应用程序可以使用 SLF4J API 进行日志记录,而实际的日志输出将由 Log4j 2 处理。
  • log4j-api.jar -- 为实现类提供创建日志记录实现所需的适配器组件接口。
  • log4j-core.jar -- 核心 Log4j 实现类。

1、Maven 依赖

xml 复制代码
<properties>
    <log4j.version>2.17.1</log4j.version>
    <slf4j.version>1.7.25</slf4j.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${log4j.version}</version>
    </dependency>
</dependencies>

2、Log4j2.properties 配置文件

一般 log4j2.properties 配置文件的结构可以分为:全局配置,根 logger 配置,Appender(日志记录器)配置。

2.1 配置两个日志记录输出(控制台和文件)的log4j2.properties,日志文件按天进行打包。【通用】

properties 复制代码
#status = debug
name= Log4jPropertiesConfig

# Configure root logger
rootLogger.level = info
rootLogger.appenderRef.rolling.ref = fileLogger
rootLogger.appenderRef.stdout.ref = STDOUT

# Console appender
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n

# RollingFileAppender name, pattern, path and rollover policy
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= app.log
appender.rolling.filePattern= app_%d{yyyyMMdd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true

根logger要绑定对应的Appender。STDOUT和fileLogger对应两个Appender的name。

properties 复制代码
rootLogger.appenderRef.rolling.ref = fileLogger
rootLogger.appenderRef.stdout.ref = STDOUT

如果只配置一个日志记录(Appender)也可以。

2.2 只配置输出到控制台(标准输出)的log4j2.properties

properties 复制代码
#status = debug
name= Log4jPropertiesConfig

rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT

# Console appender
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n

2.3 只配置输出到文件的log4j2.properties

properties 复制代码
#status = debug
name= Log4jPropertiesConfig

rootLogger.level = info
rootLogger.appenderRef.rolling.ref = fileLogger

# RollingFileAppender name, pattern, path and rollover policy
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= app.log
appender.rolling.filePattern= app_%d{yyyyMMdd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true

#appender.rolling.strategy.delete.ifLastModified.age = 30d

配置解释:

  • name= Log4jPropertiesConfig 是一个名字,随便取。
  • rootLogger.level = info:设置根记录器的日志级别。在这种情况下,设置为 "info",表示将记录 "info" 级别及以上的日志(debug、info、warn、error)。
  • appender.rolling.policies.time.interval = 1:默认单位是天,即每天的日志在0点就打包成一个文件。
  • appender.rolling.filePattern = app_%d{yyyyMMdd}.log.gz:配置打包的日志文件格式。
  • appender.rolling.strategy.delete.ifLastModified.age = 30d:设置删除日志文件的年龄阈值。超过 30 天的文件将被删除。
  • appender.rolling.fileName= app.log 修改app.log来改变日志文件的名字,比如改为application.log,支持添加相对路径,比如./logs/application.log

3、代码测试

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Log4jExample {
    private static final Logger logger = LoggerFactory.getLogger(Log4jExample.class);

    public static void main(final String[] args) {
        System.out.println("Logging to console and file...");

        logger.debug("Debug Message Logged !!!");
        logger.info("Info Message Logged !!!");
        logger.error("Error Message Logged !!!", new NullPointerException("NullError"));
    }
}

将依赖添加pom.xml文件中,将log4j2.properties文件放入resources目录下,代码运行起来,就会发现有一个app.log日志文件生成,并且控制台有输出,也可以修改rootLogger.level来控制日志输出的等级,查看变化。 至此,一个简单的日志记录框架就有已经搭建起来了。

相关推荐
余槐i1 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8261 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林2 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne3 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF4 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li4 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala5 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna5 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈5 小时前
因为太想讨好你,所以AI会骗你
后端
吴凡wudianmei5 小时前
每调一次模型都花钱?如何用工程手段把调用压到最少?
前端·后端·架构