Log4j和Log4j2的使用、安装、配置讲解

发布时间 2023-11-13 23:25:10作者: べ微熏の斜陽べ

Log4j和Log4j2的使用、安装、配置讲解

什么是日志?

日志是记录系统或应用程序在运行过程中所发生事件或行为的详细信息的文件。它通常包括时间戳、事件类型、事件描述等信息,以便在需要时进行故障排查、性能优化、安全审计等工作。日志可以帮助开发人员和系统管理员诊断应用程序问题,了解系统运行情况,以及存档和监控事件。

log4j是什么?

log4j是一个Java日志框架,可以以非常灵活的方式记录应用程序日志。它提供了一种在运行时配置日志输出和日志级别的方式,让开发人员能够方便地控制日志输出,同时它还支持多种日志输出格式和输出目标,比如输出到控制台、文件、数据库等。log4j已经非常成熟,并且广泛应用于各种Java应用程序中。

为什么要使用log4j?

log4j是一个Java日志框架,用于记录应用程序中的日志信息。它可以帮助程序员管理和输出日志,提高代码的可读性、可维护性和可扩展性。

log4j的主要概念包括:

  1. Logger:日志记录器,用于记录日志信息。每个Logger可以有自己的日志级别和Appender。
  2. Level:日志级别,用于指定日志信息的重要性。包括TRACE、DEBUG、INFO、WARN、ERROR和FATAL等级别。
  3. Appender:日志输出器,用于将日志信息输出到不同的目的地,如控制台、文件、数据库等。
  4. Layout:日志布局,用于指定日志信息的格式。
  5. Filter:日志过滤器,用于根据条件过滤不需要的日志信息。
  6. Configuration:日志配置,用于配置日志记录器、输出器、布局、过滤器等。可以通过配置文件、代码或注解进行配置。

log4j 的优点

Log4j是Java编程语言的一个开源项目,可与Java应用程序集成并提供自定义日志记录功能。以下是使用Log4j的一些优点:

  1. 灵活性:Log4j可以按照特定需求进行配置和使用,可以控制日志级别、输出目标和格式等。
  2. 性能:Log4j具有高效的日志记录功能,可以在应用程序中实现快速、高效的日志记录。
  3. 维护性:Log4j可以帮助开发人员快速发现和解决应用程序中的日志问题,有助于提高代码质量和维护性。
  4. 可扩展性:Log4j允许开发人员实现自定义日志记录功能,可根据不同的需求进行扩展和定制。
  5. 社区支持:Log4j是一个广泛使用和支持的开源项目,有大量的文档和社区资源可供参考和使用。

log4j2 的主要概念包括:

以下是log4j2的主要概念:

  1. Logger(记录器):负责记录日志信息的组件,通常通过名称来区分不同的记录器。
  2. Appender(追加器):负责将记录器产生的日志信息输出到指定的目的地,例如控制台、文件等。
  3. Layout(布局):负责将日志记录器产生的信息按照指定格式输出,可以自定义布局。
  4. Filter(过滤器):负责筛选日志信息,只输出符合特定条件的日志信息。
  5. Configuration(配置):负责配置日志系统,包括定义日志记录器、追加器、布局和过滤器等。
  6. Level(等级):负责定义日志信息的重要性,例如TRACE、DEBUG、INFO、WARN、ERROR、FATAL等。
  7. Marker(标记):负责为日志信息添加额外的标记,便于后续处理和分类。
  8. ContextMap(上下文映射):负责将关键信息以键值对的形式存储在上下文中,便于后续查询和分析。

log4j2 的优点

log4j2是Apache软件基金会的一个日志框架,具有以下优点:

  1. 高性能:log4j2使用异步日志写入,能够获得更好的性能表现。
  2. 灵活性:log4j2提供了多种输出模式和过滤器,能够满足各种不同场景和需求。
  3. 插件化:log4j2支持插件化的扩展,可以通过插件快速地集成到不同的系统中。
  4. 多线程安全:log4j2是线程安全的,多线程中不会出现数据不一致的情况。
  5. 支持多种编程语言:log4j2支持多种编程语言,在Java、Scala和Kotlin等语言中都能够使用。

log4j 和 log4j2的下载以及安装配置

以下是 log4j 的下载安装步骤:

  1. 访问 Apache log4j 官方网站,下载最新版本的 log4j。

Log4j 1.2.17官网下载地址

Log4j2 官网下载地址

  1. 解压缩下载的压缩包。

  2. 解压文件到创建好的 lib 文件夹中

    1. 将log4j2解压后的【log4j-api-2.14.1.jar】和【log4j-core-2.14.1.jar】 文件复制到项目创建好的 lib 目录下。
    2. 将 log4j 解压后的【log4j-1.2.17.jar】文件复制到项目创建好的 lib 目录下。
  3. 在项目中添加 log4j 的配置文件 log4j.properties 或者 log4j.xml。

  4. 第一种配置文件(log4j2 的配置文件):

    1. src下新建配置文件 【log4j.xml】

    2. log4j2的配置文件只能使用:.xml、.json、.jsn。

    3.  <?xml version="1.0" encoding="UTF-8"?>
       <Configuration status="WARN"> 
       	<properties>
       		<!-- 导出文件夹和文件名的变量定义 -->
       		<property name="LOG_FOLDER">D:/logs2</property>
       		<property name="FILE_NAME">log</property>
       	</properties>
       	 
       	<!-- Appenders:输出的目的地 -->
       	<!-- 三种常用的节点:
       		Console:输出到控制台
       		File:输出到文件
       		RollingFile:超过指定大小时,自动创建新的的Appender
       	-->
           <Appenders>
           	<!-- target:SYSTEM_OUT/SYSTEM_ERR。默认:SYSTEM_OUT。 -->
               <Console name="Console" target="SYSTEM_OUT">
               	<!-- pattern:输出内容的格式 -->
                   <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5p %l - %m%n" />  
               </Console>
               
               <RollingFile name="RollingFile" fileName="${LOG_FOLDER}/${FILE_NAME}.log"
               	filePattern="${LOG_FOLDER}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
               	<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5p %l - %m%n"/>
               	<!-- Policies:触发浮动的策略 -->
               	<Policies>
               		<!-- TimeBasedTriggeringPolicy:时间rollover。 -->
               		<!-- interval属性:根据日期格式中的最小时间单位来决定应该多久发生一次rollover。默认值为1。-->
               		<TimeBasedTriggeringPolicy interval="1"/>
               		<!-- SizeBasedTriggeringPolicy:文件大小rollover。-->
               		<SizeBasedTriggeringPolicy size="10 MB"/>
               	</Policies>
               	<!-- Strategy:执行滚动的策略 -->
               	<!-- 两种:DefaultRolloverStrategy/DirectWriteRolloverStrategy -->
               	<!-- DefaultRolloverStrategy:设置最多备份多少本log文件(其余的删除)。 -->
               	<DefaultRolloverStrategy max="20"/>
               </RollingFile>
           </Appenders>  
           
           <Loggers>
           	<!-- Root节点:指定项目的根日志。
       			(如果没有单独指定Logger,就会默认使用Root)
       			(没有name和additivity属性) -->
           	<!-- level属性:日志输出级别。
           		共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF -->
           	<Root level="info">
           		<!-- AppenderRef:指定该日志输出到哪个Appender -->
           		<AppenderRef ref="Console" />
       	        <AppenderRef ref="RollingFile" />
       	    </Root>
       	    
       	   <!-- Logger节点:单独指定日志的形式。(可以为指定包下的class指定不同的日志级别) -->
       	   <!-- name属性:指定该Logger所适用的类或者类所在的包
       	   		level属性:日志输出级别。默认为ERROR。 
       	   		additivity: (true:遵循父类的Appender。false:不遵循父类的Appender)。默认值true。 -->
       	    <Logger name="abc.Main" level="trace" additivity="false">
       	    	<!-- AppenderRef节点:指定该日志输出到哪个Appender -->
       	    	<!-- 如果没有指定AppenderRef,默认使用Root。
       	    		 如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出。
       	    		 可以设置Logger的additivity="false",使得只在自定义的Appender中输出。
       	    	 -->
       	    	<AppenderRef ref="Console" level="debug" />
                   <AppenderRef ref="RollingFile" level="info" />
               </Logger>
           </Loggers>  
       </Configuration>
      
  5. 第二种配置文件(log4j 1.2.17 的配置文件):

    1. src下新建配置文件【log4j.properties】

    2. 以下是一个简单的log4j.properties配置文件示例:

      # 定义根日志记录级别及输出目的地
      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{ISO8601} [%t] %-5p %c{1} - %m%n
      
      # 定义日志输出级别
      log4j.logger.com.example=DEBUG
      

      这个配置文件将根日志记录级别设置为DEBUG,并且将日志输出到控制台(stdout)。日志输出的格式使用ISO8601时间格式,包含线程名,日志级别,类名和日志内容。对于com.example包下的类,将会记录DEBUG级别的日志。

日志级别

一般日志级别包括:ALL,DEBUG, INFO, WARN, ERROR,FATAL,OFF

Log4J推荐使用:DEBUG, INFO,WARN, ERROR,FATAL

输出级别的种类:

  1. OFF
    1. 最高等级的,用于关闭所有日志记录(包括自定义的级别)。
  2. FATAL
    1. 指出严重的错误事件将会导致应用程序的退出。(Logback无)。
  3. ERROR
    1. 表明出现了系统错误和异常,无法正常完成目标操作。(调用API的方法时有异常抛出,而且异常无法处理并影响业务功能时使用)
  4. WARN
    1. 表明会出现潜在错误的情形。(某个不常走到的分支,对于常规的操作是不应该打印WARN日志的,只有在满足某个条件才能走到的分支,且这个分支引起了“警觉”,此时就应该打印WARN日志。)
  5. INFO
    1. 在粗粒度级别上突出强调应用程序的运行过程。打印一些重要的信息,这个能够用于生产环境中输出程序运行的一些重要信息。(程序入口相关参数、计算结果)
  6. DEBUG
    1. 指出细粒度信息事件,对调试应用程序是非常有帮助的,主要用于开发过程当中打印一些运行信息。
  7. TRACE
    1. 用于展现程序执行的轨迹,如函数间的相互调用关系,函数的参数和返回值等现场信息。很低的日志级别,通常不会使用。
  8. ALL
    1. 最低等级的,用于打开所有日志记录(包括自定义的级别)。

log4j 和 log4j2 日志的使用

1,在log4j中,Logger对象是通过LogManager类的静态getLogger方法创建的。例如:

import org.apache.log4j.Logger;
import org.junit.Test;

public class test {
    @Test
    public void test2(){
        Logger logger = Logger.getLogger(test.class);

        //按照输出级别输出日志
        //调试日志
        logger2.debug("Debug");
        //信息日志
        logger.info("info");
        //警告日志
        logger.warn("warn");
        //错误日志
        logger.error("error");
        //严重错误日志
        logger.fatal("fatal");
    }
}

2,在log4j2中,同样可以使用类似的方式创建Logger对象,但为了支持异步日志记录,推荐使用LogManager类的静态getLogger方法,并将LoggerConfig参数传递给它:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;

public class Demo2 {

    protected static final Logger logger = LogManager.getLogger(Main.class);

    @Test
    public void a(){
        logger.trace("trace message");
        logger.debug("debug message");
        logger.info("info message");
        logger.warn("warn message");
        logger.error("error message");
        logger.fatal("fatal message");
    }
}