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

SLF4J

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

Log4j2 和 SLF4j 绑定

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

  • slf4j-api.jar -- SLF4J 提供了一个统一的日志接口,包括 LoggerLoggerFactoryMarker 等,使得应用程序能够通过这些接口来进行日志记录。
  • 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要绑定对应的AppenderSTDOUTfileLogger对应两个Appendername

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来控制日志输出的等级,查看变化。 至此,一个简单的日志记录框架就有已经搭建起来了。

相关推荐
uzong2 小时前
技术故障复盘模版
后端
GetcharZp3 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi4 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国5 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy5 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9656 小时前
pip install 已经不再安全
后端
寻月隐君6 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github