Log4j2-Log4j 2介绍及使用

article/2025/9/18 16:38:32

  • Log4j 2 官网
  • Log4j 2简介
  • 架构
  • 日志级别
  • Filter
  • Appender 将日志请求打印到多个目标
  • Layout 自定义输出格式
  • 转到Log4j 2 API
    • 控制台Appender的简单配置
    • 文件Appender的简单配置
    • SocketAppender
    • AsyncAppender
    • 控制台和文件的AsyncAppender
  • 配置Log4j 2
  • 使用Log4j 2

Log4j 2 官网

https://logging.apache.org/log4j/2.x/


Log4j 2简介

Log4j的1.x版本已经被广泛使用于很多应用程序中。然而,它这些年的发展已经放缓。它变得越来越难以维护,因为它需要严格遵循很老的Java版本,并在2015年8月寿终正寝。它的替代品,SLF4J和Logback对框架做了很多必要的改进。

那么为什么还要费心去做Log4j 2呢?几个原因如下:

  • Log4j 2被设计为可以作为审计框架使用。Log4j 1.x和Logback都会在重新配置的时候失去事件,而Log4j2不会。在Logback中,Appender当中的异常对应用从来都是不可见的。但Log4j2的Appender可以设置为允许将异常渗透给应用程序。
  • Log4j 2包含基于LMAX Disruptor库的下一代异步日志器。在多线程情况下,异步日志器具有比Log4j 1.x和Logback高出10倍的吞吐性能以及更低的延迟。
  • Log4j 2在稳定记录状态下,对单机应用是无垃圾的,对Web应用是低垃圾的。这不仅降低了垃圾回收器的压力,还可以提供更好的响应性能。
  • Log4j 2使用插件系统使得它非常容易通过新的Appender、Filter、Layout、Lookup和Pattern Converter来扩展框架,且不需要对Log4j做任何修改。
  • 由于插件系统的配置更简单了,配置项不需要声明类名称。
  • 支持自定义日志级别。自定义日志级别可以在代码或配置中定义。
  • 支持Lambda表达式。运行在Java 8上的客户端代码可以使用Lambda表达式来实现仅在对应的日志级别启用时延迟构造日志消息。由于不需要明确地层层把关,这带来了更简洁的代码。
  • 支持Message对象。Message允许支持感兴趣或复杂的结构体在日志系统中传输,且可以被高效地操作。用户可以自由地创建他们自己的Message类型,并编写自定义的Layout、Filter和Lookup来操作它们。
  • Log4j 1.x支持Appender上的Filter。Logback引入了TurboFilter来在事件被Logger处理之前对它们进行过滤。Log4j 2支持的Filter可以设置为在被Logger接管之前即处理事件,如同它在Logger或Appender中被处理。
  • 很多Logback的Appender不接受一个Layout,且只能发送固定格式的数据。而大多数Log4j 2的Appender接受Layout,允许数据以任意一种所需的格式传输。
  • Log4j 1.x和Logback中的Layout返回一个String。这导致了在Logback Encoder中讨论的问题。Log4j 2用更简单的方法,Layout总是返回一个字节数组。优点是这意味着它们可以用于任何Appender,而不仅仅是写入到OutputStream中的那些。
  • Syslog Appender既支持TCP也支持UDP,同样支持BSD系统日志以及RFC 5424格式。
  • Log4j 2利用了Java 5的并发优势,并在尽可能最低的程度上进行锁定。Log4j 1.x中已知存在死锁问题。其中很多已经在Logback中修复,但很多Logback的class文件仍然需要在更高的编译级别中同步。
  • 这是一个被所有ASF项目集体支持使用的Apache软件基金会项目。如果你想要贡献或修改,只要参照贡献中的方法。

架构

这里写图片描述

应用程序要使用Log4j 2的API,需要从LogManager中获取一个有明确名称的Logger。

LogManager将会定位到一个合适的LoggerContext并且从中获取Logger。

如果Logger必须被创建,那么它会和包含这些信息的LogConfig相关联:
a)与Logger相同的名称;
b)父包的名称;
c)根LoggerConfig。LoggerConfig对象根据配置中的Logger声明而创建。

LoggerConfig与实际处理LogEvent事件的Appender关联。


日志级别

这里写图片描述

在表格中,垂直列为LogEvent的级别,水平列为从合适的LoggerConfig中分配到的级别。二者的交点处标识了LogEvent是否会被通过并传递给下一步处理,是(YES)或否(NO)。


Filter

Log4j提供Filter并可应用于:控制被传递到任何LoggerConfig之前、控制被传递到达一个LoggerConfig但在调用任何Appender之前、控制被传递到一个LoggerConfig单在调用一个指定的Appender和每一个Appender之前。

与防火墙过滤的方式类似,每一个Filter都将返回三个结果之一:Accept(接受)、Deny(拒绝)或Neutral(中立)。

  • 响应Accept意味着其他的Filter都不应该再被调用,而事件应该被处理。
  • 响应Deny意味着事件应该被立即忽略,且将控制讲给调用处。
  • 响应Neutral代表事件应该被传递给其他的Filter。如果没有其他Filter,则事件将被处理。

尽管一个事件可能被Filter接受,但事件仍然可能不被记录。这种情况会发生于事件被LoggerConfig之前的Filter接受,但被LoggerConfig的Filter拒绝或者被所有的Appender拒绝。


Appender 将日志请求打印到多个目标

http://logging.apache.org/log4j/2.x/manual/appenders.html

Log4j允许将日志请求打印到多个目标。用Log4j的说法,一个输出的目标位置被称为Appender。目前,Appender存在几种:控制台、文件、远程Socket服务器、Apache Flume、JMS、远程UNIX系统日志后台以及好几种数据库API。

一个Logger上可以装配多个Appender。


Layout 自定义输出格式

用户不仅希望自定义输出的目的位置,也希望自定义输出格式。

这可以通过将一个Layout与Appender关联来实现。Layout负责根据用户的希望来格式化LogEvent,然而是Appender负责将格式化的内容输出到目的位置。

PatternLayout,Log4j中的一部分,让用户根据C语言printf函数的方式来具体化输出格式。

例如,使用转换模式“%r [%t] %-5p %c - %m%n”的PatternLayout将会输出类似于下面的内容:

176 [main] INFO  org.foo.Bar - Located nearest gas station.

第一个字段是程序启动以来锁经过的毫秒时间。
第二个字段是发出日志请求的线程。
第三个字段是日志声明的级别。
第四个字段是与日志请求相关联的Logger名称。

在“-”之后的文本是日志的消息内容。

Log4j带有很多不同的Layout以支持诸如JSON、XML、HTML和Syslog


转到Log4j 2 API

大多数情况下,从Log4j 1.x API转换到Log4j 2相当简单。很多日志声明都不需要修改,但以下这些变更是必要的

这里写图片描述

控制台Appender的简单配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration><Appenders><Console name="STDOUT" target="SYSTEM_OUT"><PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/></Console></Appenders><Loggers><Logger name="org.apache.log4j.xml" level="info"/><Root level="debug"><AppenderRef ref="STDOUT"/></Root></Loggers>
</Configuration>

文件Appender的简单配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration><Appenders><File name="A1" fileName="A1.log" append="false"><PatternLayout pattern="%t %-5p %c{2} - %m%n"/></File><Console name="STDOUT" target="SYSTEM_OUT"><PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/></Console></Appenders><Loggers><Logger name="org.apache.log4j.xml" level="debug"><AppenderRef ref="A1"/></Logger><Root level="debug"><AppenderRef ref="STDOUT"/></Root></Loggers>
</Configuration>

SocketAppender

<?xml version="1.0" encoding="UTF-8"?>
<Configuration><Appenders><Socket name="A1" host="localHost" port="5000"><SerializedLayout/></Socket><Console name="STDOUT" target="SYSTEM_OUT"><PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/></Console></Appenders><Loggers><Logger name="org.apache.log4j.xml" level="debug"><AppenderRef ref="A1"/></Logger><Root level="debug"><AppenderRef ref="STDOUT"/></Root></Loggers>
</Configuration>

AsyncAppender

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug"><Appenders><File name="TEMP" fileName="temp"><PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/></File><Async name="ASYNC"><AppenderRef ref="TEMP"/></Async></Appenders><Loggers><Root level="debug"><AppenderRef ref="ASYNC"/></Root></Loggers>
</Configuration>

控制台和文件的AsyncAppender

注意AsyncAppender应该在它引用Appender的后面被配置,这会让它正确地关闭。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug"><Appenders><Console name="CONSOLE" target="SYSTEM_OUT"><PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/></Console><File name="TEMP" fileName="temp"><PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/></File><Async name="ASYNC"><AppenderRef ref="TEMP"/><AppenderRef ref="CONSOLE"/></Async></Appenders><Loggers><Root level="debug"><AppenderRef ref="ASYNC"/></Root></Loggers>
</Configuration>

配置Log4j 2

Log4j 2的配置可以通过以下4种方式之一完成:

  1. 通过以XML、JSON、YAML或属性格式编写的配置文件。
  2. 以编程方式,通过创建ConfigurationFactory和配置实现。
  3. 通过调用配置接口中公开的API,以编程方式将组件添加到默认配置。
  4. 以编程方式,通过调用内部Logger类上的方法

举例,具体请根据实际需要修改

<?xml version="1.0" encoding="UTF-8"?>
<!-- log4j2使用说明:
使用方式如下:
private static final Logger logger = LogManager.getLogger(实际类名.class.getName());2、日志说明:
(1)请根据实际情况配置各项参数
(2)需要注意日志文件备份数和日志文件大小,注意预留目录空间
(3)实际部署的时候backupFilePatch变量需要修改成linux目录-->
<configuration status="debug"><Properties><Property name="fileName">loginModule.log</Property><Property name="backupFilePatch">D:/workspace/workspace-jee/HelloSpring/hello-spring4/log/</Property></Properties><!--先定义所有的appender--><appenders><!--这个输出控制台的配置--><Console name="Console" target="SYSTEM_OUT"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /><!-- 输出日志的格式--><PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" /></Console><!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFile" fileName="${backupFilePatch}${fileName}"filePattern="${backupFilePatch}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz"><PatternLayout
                pattern="%d{yyyy.MM.dd 'at' HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n" /><!-- 日志文件大小 --><SizeBasedTriggeringPolicy size="20MB" /><!-- 最多保留文件数 --><DefaultRolloverStrategy max="20"/></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><loggers><!--建立一个默认的root的logger--><Logger name="org.apache.log4j.xml" level="trace"additivity="true"><AppenderRef ref="RollingFile" /></Logger><Root level="error"><AppenderRef ref="Console" /></Root></loggers>
</configuration>

使用Log4j 2

maven 的引用

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version>
</dependency>
<!-- web容器中需要添加log4j-web -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j2.version}</version>
</dependency><properties><log4j2.version>2.8.2</log4j2.version>
</properties>
import com.foo.Bar;// 导入Log4j的类
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;public class MyApp {// 定义一个静态的日志器变量,引用名为MyApp的实例private static final Logger logger = LogManager.getLogger(MyApp.class);public static void main(final String... args) {// 设置一个简单的配置,日志显示在控制台中logger.trace("Entering application.");Bar bar = new Bar();if (!bar.doIt()) {logger.error("Didn't do it.");}logger.trace("Exiting application.");}
}
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;public class Bar {static final Logger logger = LogManager.getLogger(Bar.class.getName());public boolean doIt() {logger.entry();logger.error("Did it again!");return logger.exit(false);}
}

如果Log4j找不到配置文件,它将提供默认配置。DefaultConfiguration类中提供的默认配置将设置:

  • 一个附加到根记录器的ConsoleAppender。
  • 一个设置为“%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -
    %msg%n”的PatternLayout,被附加到ConsoleAppender上。

注意,默认情况下Log4j将根日志记录器分配给Level.ERROR。

MyApp的输出类似如下:

17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] ERROR MyApp - Didn't do it.

如前所述,Log4j将首先尝试从配置文件配置自身。与默认配置相同的配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="error"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

一旦上述文件作为log4j2.xml放入到类路径中,你将得到与上面列出的相同结果。将根级别更改为trace将得到类似于以下的结果:

17:13:01.540 [main] TRACE MyApp - Entering application.
17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] TRACE com.foo.Bar - exit with (false)
17:13:01.540 [main] ERROR MyApp - Didn't do it.
17:13:01.540 [main] TRACE MyApp - Exiting application.

请注意,使用默认配置时,将禁用状态日志的记录。



http://chatgpt.dhexx.cn/article/IISp3Gmp.shtml

相关文章

log4j2 使用详解

转载自 Blog of 天外的星星&#xff1a; http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了&#xff0c;如果你搜了2&#xff0c;说明你对他已经有一定的了解&#xff0c;并且想用它&#xff0c;所以这里直接就上手了。 1. 去官方下载log4j …

一问三不知之log4j2漏洞简析

1.log4j2漏洞介绍 1.1简介 Apache Log4j 2是对Log4j的升级&#xff0c;它比其前身Log4j 1.x提供了重大改进&#xff0c;并提供了Logback中可用的许多改进&#xff0c;同时修复了Logback架构中的一些问题。是目前最优秀的Java日志框架之一。 2021年11月24日&#xff0c;阿里云…

Log4j2使用详解

日志框架简单比较&#xff08;slf4j、j.u.l、log4j、logback、log4j2 &#xff09; slf4j&#xff1a;slf4j是对所有日志框架制定的一种规范、标准、接口&#xff0c;并不是一个框架的具体的实现&#xff0c;因为接口并不能独立使用&#xff0c;需要和具体的日志框架实现配合使…

log4j2配置参数详解

1.概述 JAVA常用的日志收集api和实现框架都有多种&#xff0c;不同的api和实现框架之间怎么相互兼容都比较复杂&#xff0c;不过大部分的日志框架实现也都提供了对其他日志收集方式的兼容和切换&#xff08;可以参考slf4j、jcl、jul、log4j1、log4j2、logback大总结 - 乒乓狂魔…

Log4j2详解

1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式&#xff0c;其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。 2.Log4j2中的同步日志 所谓同步日志&#xff0c;即当输出日志时&#xff0c;必须等待日志输出语句执行完毕后&#xff0c;才能执…

log4j2 的使用【超详细图文】

log4j2 的使用 Apache Log4j2 是对Log4j 的升级版本&#xff0c;参考了logback 的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带来了一些重大的提升&#xff0c;主要有&#xff1a; 异常处理&#xff0c;在logback中&#xff0c;Appender中的异常不会被应…

Log4j2 简介

介绍 Log4j2是Log4j的升级版&#xff0c;与之前的版本Log4j 1.x相比、有重大的改进&#xff0c;修正了Logback固有的架构问题的同事&#xff0c;改进了许多Logback所具有的功能。 特性 一、API 分离 Log4j2将API与实现分离开来。开发人员现在可以很清楚的知道能够使用哪些没有兼…

数据分析方法08用户画像

用户画像 1、 概念 用户画像是指用户信息标签化&#xff0c;通过收集用户多维度的信息数据&#xff08;如人口统计属性&#xff0c;社会属性&#xff0c;行为偏好&#xff0c;消费习惯等&#xff09;&#xff0c;对其进行统计&#xff0c;分析&#xff0c;从而抽象出用户信息…

用户画像及其应用案例分享

一、用户画像基础概念 用户画像&#xff0c;即用户信息标签化&#xff0c;通过收集用户的社会属性、消费习惯、偏好特征等各个维度的数据&#xff0c;对用户特征属性进行刻画&#xff0c;并对这些特征进行分析、统计&#xff0c;挖掘潜在价值信息&#xff0c;从而抽象出用户的…

大数据分析--用户画像

从去年还在北京工作的时候就开始不断的听说&#xff0c;用户画像、用户画像&#xff0c;而且&#xff0c;有个项目&#xff0c;项目领导美其名曰&#xff1a;用户画像&#xff0c;这么长时间&#xff0c;也没有真正的思考过什么叫用户画像。前几天看到一篇关于这方面的文章&…

【数据分析】京东平台用户画像分析

1.用户信息标签 用户信息的收集包括用户基础要素、用户场景、行为偏好、心理个性、交际等多方面。 可以用静态标签、动态标签两大类来划分。 静态数据:用户相对稳定的信息&#xff0c;主要包括人口属性、商业属性等方面数据&#xff1b;这类信息果企业有真实信息则无需过多建…

用户画像解析

用户画像是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像&#xff0c;它也是和精准营销、精细化运营直接钩挂的。这篇文章主要讲产品和运营角度的用户画像。 一、什么是用户画像 用户画像一点也不神秘&#xff0c;它是根据用户在互联网留下的种种数据&#xff0c;主…

用户画像分析总结

一、 什么是用户画像 用户画像是指根据用户的属性、用户偏好、生活习惯、用户行为等信息而抽象出来的标签化用户模型。通俗说就是给用户打标签&#xff0c;而标签是通过对用户信息分析而来的高度精炼的特征标识。通过打标签可以利用一些高度概括、容易理解的特征来描述用户&…

用户画像详解来了

导读&#xff1a;今天主要和大家分享明略对于用户画像的认识&#xff0c;包括如何理解用户画像&#xff0c;为什么需要用户用画像&#xff0c;以及明略在建设和应用用户画像过程中总结的方法论&#xff0c;让大家了解如何构建好的用户画像。 01 什么是用户画像 首先来看用户画像…

Python的import

Python里面的import语句用于导入一个已经写好的包或者模块 使得自己的程序里面可以使用导入的模块里面的函数、变量等 import name 导入numpy模块&#xff0c;里面有一个shape函数&#xff0c;要使用这个函数&#xff0c;numpy.shape()即可 但是不加numpy就不行&#xff0c;…

python-import this

优美胜于丑陋&#xff08;python 以编写优美的代码为目标&#xff09; 明了胜于晦涩&#xff08;优美的代码应该是明了的&#xff0c;命名规范&#xff0c;风格相似&#xff09; 简洁胜于复杂&#xff08;优美的代码应当是简洁的&#xff0c;不要有复杂的内部实现&#xff09…

import re

元字符 px* 可以匹配 p px px... px 可以匹配 px px... 但是不能匹配到p默认的匹配都是贪婪匹配 贪婪匹配就是一次匹配尽可能多的内容比如正则是 aoe 要匹配的字符串是 aoeeeeee 它可以匹配到aoeeeeee 但是如果正则是 aoe? 的话 它只能匹配到aoe ?放在 * {n,m}是取消贪婪匹…

1.连接服务器

1 使用服务器 参考文章&#xff1a;https://blog.csdn.net/longgeaisisi/article/details/78680180 双11通过团购入手阿里云服务器会得到一个提货券&#xff0c;同时收到短信提醒&#xff0c;跟着短信链接&#xff0c;进入阿里云控制台使用提货券。然后&#xff0c;会出现选项…

windows下连接服务器

一、windows下连接服务器 xhsell 是一个windows的软件 是用来连接远程服务器的 使用的是ssh协议 xftp 一个windows的软件 用来给服务器 上传或者下载文件的一个工具 ftp协议 shell环境 是运行命令的环境 shell脚本 用于给运维人员 来去做批量处理的 一个语言shell语言编写的一个…

linux之连接服务器

1. 背景 通常连接服务器使用ssh usernamehostname的方式&#xff0c;其中uername是用户名&#xff0c;一般为root等。hostname为ip地址。但是ip地址通常不容易记住&#xff0c;因此会将ip地址与一个名称相对应&#xff0c;然后直接使用名字来登陆服务器。 2. ip与name的映射 …