跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 项目中基于 Log4j 的日志工具类封装实践

Java 项目中基于 Log4j 的日志工具类封装实践。通过定义 Logger 接口统一日志输出标准,结合 LoggerAdapter 实现具体配置加载与日志级别控制,并辅以 LogUtils 类处理日志消息格式(如类名、业务名、SQL 内容拼接)。该方案旨在简化日志调用流程,提升代码可维护性与可读性,适用于需要标准化日志输出的企业级应用开发场景。

Eee_123发布于 2024/12/23更新于 2026/10/2596 浏览
Java 项目中基于 Log4j 的日志工具类封装实践

Java 项目中基于 Log4j 的日志工具类封装实践

在 Java 企业级开发中,日志是系统调试、监控和排查问题的核心手段。直接调用 Log4j 往往导致耦合度高、日志格式不统一。这里分享一种封装方案,通过接口抽象和工具类辅助,让日志调用更简洁规范。

1. 定义日志接口

首先定义统一的 Logger 接口,屏蔽底层 Log4j 的具体实现细节,方便后续切换或扩展。

public interface Logger {
    /** 配置文件路径 */
    String LOG4JFILE = "log4j.properties";
    
    /** 日志名称空间 */
    String SYSTEMLOG = "Systemlog";
    
    void debug(Object message);
    void debug(Object message, Throwable throwable);
    void info(Object message);
    void info(Object message, Throwable throwable);
    void warn(Object message);
    void warn(Object message, Throwable throwable);
    void error(Object message);
    void error(Object message, Throwable throwable);
}

2. 实现 Log4j 适配器

核心在于 LoggerAdapter,负责初始化配置并代理实际日志输出。注意懒加载机制,确保配置只加载一次,避免重复读取文件。

package com.example.log;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LoggerAdapter implements Logger {
    private static Logger log4j = null;

    public static void getInstance() {
        PropertyConfigurator.configure(LOG4JFILE);
        log4j = Logger.getLogger(SYSTEMLOG);
    }

    @Override
    public void debug(Object message) {
        if (log4j == null) getInstance();
        log4j.debug(message);
    }

    @Override
    public void debug(Object message, Throwable throwable) {
        if (log4j == null) getInstance();
        log4j.debug(message, throwable);
    }

    @Override
    public void info(Object message) {
        if (log4j == null) getInstance();
        log4j.info(message);
    }

    @Override
    public void info(Object message, Throwable throwable) {
        if (log4j == null) getInstance();
        log4j.info(message, throwable);
    }

    @Override
    public void warn(Object message, Throwable throwable) {
        if (log4j == null) getInstance();
        log4j.warn(message, throwable);
    }

    @Override
    public void warn(Object message) {
        if (log4j == null) getInstance();
        log4j.warn(message);
    }

    @Override
    public void error(Object message) {
        if (log4j == null) getInstance();
        log4j.error(message);
    }

    @Override
    public void error(Object message, Throwable throwable) {
        if (log4j == null) getInstance();
        log4j.error(message, throwable);
    }
}

3. 日志消息格式化

为了保持日志一致性,引入 LogUtils 处理类名、业务名、SQL 等信息的拼接。这能让日志内容结构化,便于后续分析。

package com.example.log;

public final class LogUtils {
    private final static String SEPARATOR = " ";

    /**
     * 准备日志内容
     *
     * @param className   类名
     * @param businessName 业务名
     * @param message      输出内容
     * @param sql          SQL 内容
     * @return 格式化后的日志缓冲区
     */
    public static StringBuffer prepareLogMessage(Class className, String businessName,
            String message, String sql) {
        StringBuffer logBuffer = new StringBuffer();
        String name = null;

        if (className != null) {
            name = className.getName();
            logBuffer.append(name).append(SEPARATOR);
        }
        if (businessName != null) {
            logBuffer.append(businessName).append(SEPARATOR);
        }
        if (message != null) {
            logBuffer.append(message).append(SEPARATOR);
        } else {
            logBuffer.append(SEPARATOR);
        }

        if (sql != null) {
            logBuffer.append(sql).append(SEPARATOR);
        } else {
            logBuffer.append(SEPARATOR);
        }
        return logBuffer;
    }

    /**
     * 非 SQL 用 日志内容准备
     */
    public static StringBuffer setTextMessage(Class className, String businessName, String message) {
        return prepareLogMessage(className, businessName, message, null);
    }

    /**
     * SQL 用 日志内容准备
     */
    public static StringBuffer setTextMessage(Class className, String businessName, String message, String sql) {
        return prepareLogMessage(className, businessName, message, sql);
    }

    /**
     * 仅消息日志准备
     */
    public static StringBuffer setTextMessage(String message) {
        return prepareLogMessage(null, null, message, null);
    }

    /**
     * 业务名 + 消息日志准备
     */
    public static StringBuffer setTextMessage(String businessName, String message) {
        return prepareLogMessage(null, businessName, message, null);
    }
}

4. 配置说明

记得在项目资源目录下放置 log4j.properties 文件,确保 PropertyConfigurator 能找到配置。例如:

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n

这种封装方式不仅降低了代码耦合度,还统一了日志输出标准,在实际维护中非常实用。

目录

  1. Java 项目中基于 Log4j 的日志工具类封装实践
  2. 1. 定义日志接口
  3. 2. 实现 Log4j 适配器
  4. 3. 日志消息格式化
  5. 4. 配置说明

更多推荐文章

查看全部
  • PostgreSQL 动态分区裁剪技术:查询性能优化解析
  • 数据结构与算法:C++ 堆的实现与原理详解
  • NASA 火星任务软件测试:利用 AIGC 模拟极端环境攻击
  • 前端文件下载实战:从原理到最佳实践
  • AI Agent 基础架构与核心组件详解
  • C++11 核心特性:列表初始化与右值引用移动语义详解
  • 5 款开源 PPT 生成大模型实测对比:从技术原理到实战效果
  • RocketMQ 5.0 延时消息架构:时间轮算法与分布式调度实践
  • AI Agent 推理架构对比:ReAct 与 Plan-and-Execute 的选择
  • AI 图像生成指南:从原理到实战
  • C++ 位运算详解:基础题解与思维分析
  • Node.js 安装指南(macOS 版)
  • 2024 年转行 AI 产品经理的时机与准备指南
  • Python 数据科学工具链入门:NumPy、Pandas、Matplotlib 实战指南
  • Python PyQt5 安装与配置及界面设计教程
  • 基于 ChatGLM-6B 的医疗领域大模型微调实战指南
  • 内容创作模式解析:UGC、PGC、PUGC、OGC、MGC、BGC 与 AIGC
  • 《自然语言处理:大模型理论与实践》:大模型核心技术与实战指南
  • 双指针算法专题:移动零与复写零
  • Axure 制作 AI 自动对话机器人原型教程

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online