Java log4j详细教程

Java log4j详细教程

什么是log4j

log4j是一种用于记录Java日志的流行框架,它允许开发人员在应用程序中添加灵活的、可配置的日志记录,并支持若干输出目标。

如何使用log4j

步骤一:将log4j库添加到项目中

在项目中添加log4j库有以下两种方法:

  1. 将log4j包含在项目的Classpath路径下
  2. 在Maven或Gradle等构建工具中添加log4j的依赖

步骤二:创建log4j.properties配置文件

log4j.properties是log4j用于初始化日志器和布局器的配置文件,我们需要根据需要对其进行修改,例如设置日志级别、输出位置等。以下是一组示例配置:

log4j.rootLogger=DEBUG, 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.SSS} [%t] %-5p %c - %m%n

#名称为testLogger的日志记录器,仅记录DEBUG级别以上的日志信息到dailyFile中
log4j.logger.testLogger=DEBUG, dailyFile

#每天产生一个日志文件,文件名中的日期格式为yyyy-MM-dd
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.File=D:\\logs\\test.log
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n

步骤三:在Java代码中使用log4j

import org.apache.log4j.Logger;

public class Test {
    private static Logger logger = Logger.getLogger(Test.class);

    public static void main(String[] args) {
        logger.debug("Debug level message.");
        logger.info("Info level message.");
        logger.warn("Warn level message.");
        logger.error("Error level message.");
        logger.fatal("Fatal level message.");
    }
}

以上代码创建了一个名为"Test"的类,并使用了log4j中的Logger类,logger的级别依次为debug、info、warn、error、fatal。这些日志级别依次递增,例如WARN级别及以上级别的日志会被输出到console和dailyFile中。

log4j的几个核心组件

Logger

Logger是log4j的核心类之一,用于记录不同级别的日志信息。

一般来讲,我们为每个需要记录日志的类创建一个Logger对象,Logger对象的名称通常使用类全名,对应了配置文件中的logger部分。

日志级别(从高到低)分别为:FATAL、ERROR、WARN、INFO、DEBUG。通常,我们需要配置一个root logger,以便它能够捕获所有的消息。

Appender

Appender用于将不同级别的日志输出到指定的位置。例如,我们可以将所有级别的日志发送到控制台、文件、系统日志或邮件。

常见的几种Appender有:

  • ConsoleAppender:控制台输出的Appender
  • FileAppender:文件输出的Appender
  • SMTPAppender:邮件发送的Appender
  • SocketAppender:套接字输出的Appender

Layout

Layout用于控制日志记录器输出的格式。例如,我们可以将日志以JSON格式输出或XML格式输出,以便我们可以更轻松地搜索和分析日志。

常见的几种Layout有:

  • PatternLayout:以指定模式格式化字符串的Layout
  • HTMLLayout:以HTML格式布局的Layout
  • SimpleLayout:以简单格式布局的Layout

示例1

假设我们有一个需求,需要记录一个类中的所有函数的调用和返回时所用的时间戳,并将其输出到文件中。

首先,我们需要创建一个新的Appender:

import org.apache.log4j.WriterAppender;
import org.apache.log4j.spi.LoggingEvent;

import java.io.IOException;
import java.io.Writer;

public class TimestampAppender extends WriterAppender {
    @Override
    public void append(LoggingEvent event) {
        //记录方法调用和返回时间戳,并输出到文件中
        long timestamp = System.currentTimeMillis();
        String msg = event.getRenderedMessage();
        msg = timestamp + " | " + msg;
        try {
            Writer writer = getWriter();
            writer.write(msg);
            writer.write("\n");
            writer.flush();
        } catch (IOException e) {
            errorHandler.error("Error writing to writer.", e, ErrorCode.WRITE_FAILURE);
        }
    }
}

其中,我们继承了WriterAppender类并覆盖了其append方法,添加了输出时间戳的逻辑。

接着,我们创建一个新的Layout:

import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.PatternLayout;

public class TimestampPatternLayout extends PatternLayout {
    @Override
    public String format(LoggingEvent event) {
        //在日志消息前加入时间戳
        long timestamp = System.currentTimeMillis();
        String msg = super.format(event);
        return timestamp + " | " + msg;
    }
}

在这个Layout中,我们继承了PatternLayout类,覆盖了了format方法,添加了输出时间戳的逻辑。

最后,在配置文件中添加以下内容:

log4j.rootLogger=DEBUG, FILE
log4j.appender.FILE=com.example.TimestampAppender
log4j.appender.FILE.layout=com.example.TimestampPatternLayout
log4j.appender.FILE.File=D:\\log.log

以上配置将日志记录到D:\log.log文件中,日志消息被格式化为时间戳加上消息。

示例2

假设我们需要将日志存储到数据库中,并添加下一步操作时需要知道上一个日志记录的ID,我们可以通过log4j提供的NDC(Nested Diagnostic Context)来实现。NDC是一个堆栈,每个线程都拥有自己的NDC。

在应用程序中,我们可以通过调用NDC.push()方法将新的值添加到NDC中;通过调用NDC.get()方法获取NDC堆栈顶部的当前值。以下是配置文件:

log4j.rootLogger=debug, DB
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.Threshold=debug
log4j.appender.DB.URL=jdbc:postgresql://localhost:5432/testlogdb
log4j.appender.DB.driver=org.postgresql.Driver
log4j.appender.DB.user=myuser
log4j.appender.DB.password=mypassword
log4j.appender.DB.layout=org.apache.log4j.PatternLayout
log4j.appender.DB.layout.ConversionPattern=[%p] [%t] [%d] [%c] [[%X{ID}]]-[%m]%n

以上配置将日志记录到PostgreSQL数据库中,日志消息旁边的方括号中是NDC堆栈顶部的当前值。

在Java代码中,我们可以通过以下方式设置NDC:

NDC.push("123456");
logger.info("Message");
NDC.remove();

以上代码会将123456添加到NDC堆栈,然后记录一个信息,最后将NDC堆栈顶部的元素删除。

总结

这篇文章介绍了log4j的基本概念和使用方法,并提供了两个示例,同时还介绍了log4j的几个核心组件,包括Logger、Appender和Layout。了解了这些内容,相信你已经可以在你的项目中使用log4j来记录日志了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java log4j详细教程 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Spring MVC拦截器_动力节点Java学院整理

    以下是关于“Spring MVC拦截器_动力节点Java学院整理”的完整攻略,其中包含两个示例。 Spring MVC拦截器 Spring MVC拦截器是一种用于拦截请求和响应的机制。在本文中,我们将讲解Spring MVC拦截器的实现原理及用法。 拦截器实现原理 Spring MVC拦截器的实现原理是通过实现HandlerInterceptor接口来实现的…

    Java 2023年5月17日
    00
  • 用3个实例从原理到实战讲清楚Log4j史诗级漏洞

    下面我将通过三个实例,从原理到实战,讲解清楚Log4j史诗级漏洞的完整攻略。 什么是 Log4j Log4j是一个流行的Java日志框架,它是Apache的一个子项目。Log4j可以帮助Java开发人员以更优美的方式记录日志,便于排错和性能调优。 Log4j的漏洞 但是,在2021年底,Log4j被发现有史以来最严重的漏洞,被称为 Log4Shell ,它属…

    Java 2023年6月15日
    00
  • Java策略模式的简单应用实现方法

    接下来我会详细讲解“Java策略模式的简单应用实现方法”的完整攻略。 什么是策略模式? 策略模式是一种行为型设计模式,它允许你定义一组算法,将每个算法都封装起来,并使它们之间可以互换。该模式让算法的变化独立于使用它们的客户端,即可以在不修改客户端代码的情况下更换执行算法。 策略模式的应用场景 当需要在不同情况下使用不同的算法时,可以使用策略模式,将每种算法都…

    Java 2023年5月26日
    00
  • 怎么开启Java小程序脚本? 浏览器采用Java小程序脚本的技巧

    开启Java小程序脚本: Java小程序(Java applet)是用Java语言编写的小程序,可以在网络浏览器上运行,为在浏览器中使用Java小程序,需要遵循以下步骤: 安装Java运行环境(Java runtime environment,JRE),只要在Java官网下载JRE安装即可,注意选择与你电脑系统相匹配的版本。 将Java小程序嵌入到HTML页…

    Java 2023年5月23日
    00
  • 老生常谈java中的数组初始化

    下面是关于Java中数组初始化的完整攻略: 数组的定义与声明 在Java中,数组需要先定义后使用。数组的定义语法如下: type[] arrayName; 其中,type 表示数组中元素的数据类型,大括号 [] 表示数组类型,arrayName 是数组的变量名。例如,定义一个整型数组变量的代码如下: int[] nums; 定义好数组变量之后,需要声明数组的…

    Java 2023年5月26日
    00
  • Java中Lambda表达式和函数式接口的使用和特性

    Java中Lambda表达式和函数式接口的使用和特性 什么是Lambda表达式 Lambda表达式是Java 8中引入的新特性,简化了在Java中使用函数式编程的写法。Lambda表达式本质是一个匿名函数,可以被看作是一个代码块,使得代码更加简洁清晰。 Lambda表达式使用类似于箭头的符号(->)将参数列表和函数体分开,其语法格式为: (parame…

    Java 2023年5月26日
    00
  • 从源码角度深入解析Callable接口

    摘要:从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小。 本文分享自华为云社区《一个Callable接口能有多少知识点?》,作者: 冰 河。 并发编程一直是程序员们比较头疼的,如何编写正确的并发程序相比其他程序来说,是一件比较困难的事情,并发编程中出现的 Bug 往往也是特别诡异的。 之所以说并发编…

    Java 2023年4月18日
    00
  • Java8常用的新特性详解

    Java8常用的新特性详解 Java8是Java语言的一个重大升级,带来了很多新特性。本文将会详细讲解Java8中常用的新特性,方便读者更好地掌握和使用Java8。 Lambda表达式 Lambda表达式是Java8中引入的一项重要特性。它可以用来替代Java中的匿名内部类,并且更加简洁明了。Lambda表达式的语法非常简单,格式如下: (parameter…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部