八十六、Log4j与Log4j2 你真的明白了吗?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 八十六、Log4j与Log4j2 你真的明白了吗?

一个完整的软件,日志是必不可少的。程序从开发、测试、维护、运行等环节,都需要向控制台或文件等位置输出大量信息。这些信息的输出, 在很多时候是使用System.out.println()无法完成的。


日志信息根据用途与记录内容的不同,分为调试日志、运行日志、异常日志等。用于日志记录的技术很多,如 jdk 的 logger 技术,apache 的 log4j、log4j2 技术等。


Log4j 的全称为 Log for java,即,专门用于 java 语言的日志记录工具。其目前有两个版本:Log4j 与 Log4j2。



35.png

Log4j的下载


Log4j下载地址:http://logging.apache.org/


36.png


日志级别


为了方便对于日志信息的输出显示,对日志内容进行了分级管理。日志级别由高到低 , 共分 6 个级别:fatal(致命的)、error、warn、info、debug、trace(堆栈)。


为什么要对日志进行分级呢?


无论是将日志输出到控制台,还是文件,其输出都会降低程序的运行效率。但由于调试、运行维护的需要,客户的要求等原因,需要进行必要的日志输出。这时就必须要在代码中加入日志输出语句。


这些输出语句若在程序运行时全部执行, 则势必会降低运行效率。例如, 使用System.out.println()将信息输出到控制台,则所有的该输出语句均将执行。会大大降低程序的执行效率。而要使其不输出,唯一的办法就是将这些输出语句逐个全部删除。这是个费时费力的过程。


将日志信息进行分级管理,便可方便的控制信息输出内容及输出位置:哪些信息需要输出,哪些信息不需要输出,只需在一个日志输出控制文件中稍加修改即可。而代码中的输出语句不用做任何修改。


从这个角度来说,代码中的日志编写,其实就是写大量的输出语句。只不过,这些输出语句比较特殊,它们具有级别,在程序运行期间不一定被执行。它们的执行是由另一个控制文件控制。


日志输出控制文件


Log4j 的日志输出控制文件,主要由三个部分构成:


1.日志信息的输出位置:控制日志信息将要输出的位置,是控制台还是文件等。

2.日志信息的输出格式:控制日志信息的显示格式,即以怎样的字符串形式显示。

3.日志信息的输出级别:控制日志信息的显示内容,即显示哪些级别的日志信息。


有了日志输出控制文件,代码中只要设置好日志信息内容及其级别即可,通过控制文件便可控制这些日志信息的输出了。


在程序中的日志实现步骤


项目:log4j


若要在自己的程序中写入日志语句,则可按照以下步骤进行:


(1)导入Jar包


       在项目中导入 log4j 需要的 jar 包。将 Log4j 框架的 zip 文件进行解压,在其根目录下就有其 Jar 包。


37.png


(2)放入日志输出控制文件


       将属性文件 log4j.properties 直接放到项目的 src 下。


(3)代码中实现日志记录


       在要输出日志的类中创建日志对象 Logger,并通过 Logger 的方法在代码中加入日志输出语句。在 Java 代码中进行日志输出,需要用到 Logger 类的静态方法 getLogger()。


       注意,Logger 为 org.apache.log4j 包中的类。


38.png


将来这些日志输出语句,会根据 log4j.properties 文件中日志级别的设置进行输出,会输出到指定位置。其输出结果是:输出指定级别及其更高级别的信息。如指定 info 级别,则会输出 fatal、error、warn、info 级别的信息。就本例而言,会执行以下三句,而不会执行debug() 方法。


39.png


日志输出控制文件分析

日志属性文件 log4j.properties 是专门用于控制日志输出的。其主要进行三方面控制:


输出位置:控制日志将要输出的位置,是控制台还是文件等。


输出布局:控制日志信息的显示形式。


输出级别:控制要输出的日志级别。


日志属性文件由两个对象组成:日志附加器与根日志。


       根日志,即为 Java 代码中的日志记录器,其主要由两个属性构成:日志输出级别与日志附加器。


       日志附加器,则由日志输出位置定义,由其它很多属性进行修饰,如输出布局、文件位置、文件大小等。


50.png


定义日志附加器appender


所谓日志附加器,就是为日志记录器附加上很多其它设置信息。附加器的本质是一个接口,其定义语法为:log4j.appender.appenderName = 输出位置


appenderName 为自定义名称。


       输出位置为 log4j 指定的类型,是定义好的一些 appender 接口的实现类。查看 log4j 框架解压目录下的站点目录 site 的 index.jsp 中的 JavaDoc,可看到 log4j 的 API。


例如定义了一个名称为 console 的控制台附加器:


51.png


常用的附加器实现类如下:


52.png


org.apache.log4j.ConsoleAppender:日志输出到控制台

org.apache.log4j.FileAppender:日志输出到文件

org.apache.log4j.RollingFileAppender:当日志文件大小到达指定尺寸的时候将产生一个新的日志文件

org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件


修饰日志附加器


所谓修饰日志附加器,就是为定义好的附加器添加一些属性,以控制到指定位置的输出。


不同的附加器,其修饰属性不同。


(1)控制台附加器:


53.png


Target:控制输出到控制台的使用目标。其值为 System.out  或 Sytem.err。


它们的区别是,System.out 是以黑色字体显示到控制台,而 System.err 则是以红色字体显示。


(2)文件附加器:


54.png


File:日志要输出的文件位置及文件名称。


(3)滚动文件附加器:


MaxFileSize:用于指定日志文件的最大值。若文件超过指定值,将自动产生另一个日志文件。


Log4j常用布局类型:


org.apache.log4j.HTMLLayout:网页布局,以 HTML 表格形式布局。


org.apache.log4j.SimpleLayout:简单布局,包含日志信息的级别和信息字符串。


org.apache.log4j.PatternLayout:匹配器布局,可以灵活地指定布局模式。其主要是通过设置PatternLayout 的 ConversionPattern 属性值来控制具体输出格式的。


ConversionPattern 的值中有很多控制字符,这些字符的意义如下表所示:


参数 说明 例子

%c 列出 logger 名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间

log4j 配置文件


参数举例 输出显示媒介

假设logger名字空间是"a.b.c"

%c a.b.c

%c{2} b.c

%20c 长度小于20,左边用空格填充

%d 显示日志记录时间,{<日期格式>}使用IS08601定义的日期格式

%d{yyyy/MM/dd


HH:mm:ss,SSS}


2022/3/27 9:40:30,117

%F 显示调用logger的源文件名 %F MyClass.java

%L 显示调用Logger的代码行 %L 129

%m 显示输出消息 %m This is a message for debug

%M 显示调用logger的方法名 %M main

%n 当前平台下的换行符 %n

Windows下表示rn


UNIX下表示n


%p 显示该条日志的优先级 %p INFO

%t 输出产生该日志事件的线程名 %t MyClass


配置根logger


配置 rootLogger,以便于代码加载来控制日志的输出。其语法为:


log4j.rootLogger = [ level ] , appenderName, …

其中,level 是日志记录的优先级,分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。


OFF 为关闭日志功能。


低级别的可以显示高级别的,但高级别的不能显示低级别的。所以,级别越高,将来显示的信息就越少。


og4j2,是对 Log4j 的升级,其在配置与使用上发生了较大变化。


日志实现步骤


项目:log4j2


(1)导入Jar包


使用 Log4j2,需要导入其 Jar 包。Log4j 框架解压目录中找到如下两个 jar 包:


55.png


(2)放入日志输出控制文件


       将文件 log4j2.xml 直接放到项目的 src 下。log4j2 配置文件是 XML 文件,不再支持properties 文件。默认的文件名为 log4j2.xml。其存放的位置为 classpath 中。


(3)代码中实现日志记录


       在要输出日志的类中创建日志对象 Logger,并通过 Logger 的方法在代码中加入日志输出语句。该日志对象是通过静态类 LogManager 的 getLogger()方法获取的。


       注意,Logger 与 LogManager 均为 org.apache.logging.log4j 包中的类,非 org.apache.log4j包中的。


56.png


       log4j2 配置文件是 XML 文件,不再支持 properties 文件。默认的文件名为 log4j2.xml。其存放的位置为 classpath 中。


若没有设置 log4j2.xml,则系统会使用默认的日志配置:只会输出到控制台 error 级别的信息。


57.png


配置文件说明:


(1)<configuration/>标签


       <configuration/>标签的 status 属性用于设置 Log4j2 自身运行的日志显示级别,一般为OFF,不显示。当然,也可以设置为 ERROR、DEBUG 等其它级别。


(2)<Console/>标签


       <Console/>标签的 target 属性用于设置输出的目标形式,其值一般为:SYSTEM_OUT 或 SYSTEM_ERR


58.png


(3)<File/>标签


       <File/>标签的 fileName 属性用于设置文件的文件保存路径及文件名。如本例的意思是, 日志文件名为 test.log,将其存放在当前项目的根目录下的 log 子目录中。


append 属性用于设置是否以追加方式将日志写入指定文件。


59.png


       <RollingFile/>标签的<SizeBasedTriggeringPolicy/>子标签用于指定每一个日志文件最大文件大小。当达到这个指定值后,会自动再新建一个日志文件。


(4)<Rollingfile/>标签


       fileName 指定存放目录及第一个日志文件名。filePattern 指定新创建的日志文件的文件名。本例还会对文件进行压缩。


60.png


(5)<loggers/>标签


       用于配置根 Logger 对象,以指定所使用的日志记录器,及显示的级别。


       其子标签<root/>用于指定所使用的日志记录器。该子标签的属性 level 用于指定显示级别。而日志记录器是通过<root/>的子标签<appender-ref/>来引用<appenders/>中定义好的记录器的。


需要注意的是,只要在<appenders/>中定义了<File/>、<RollingFile/>等,且在其中指定了日志存放的目录,那么这些目录就会自动创建。无论在<loggers/>的<root/>中是否声明使用它们。


61.png


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
279 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
314 3
|
3月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
4月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
5月前
|
Java 测试技术 Apache
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
【7月更文挑战第4天】Apache Log4j 是一个广泛使用的 Java 日志框架,它允许开发者控制日志信息的输出目的地、格式和级别。Log4j 包含三个主要组件:Loggers(记录器)负责生成日志信息,Appenders(输出源)确定日志输出的位置(如控制台、文件、数据库等),而 Layouts(布局)则控制日志信息的格式。通过配置 Log4j,可以灵活地定制日志记录行为。
63 4
|
4月前
|
存储 运维 Java
SpringBoot使用log4j2将日志记录到文件及自定义数据库
通过上述步骤,你可以在Spring Boot应用中利用Log4j2将日志输出到文件和数据库中。这不仅促进了良好的日志管理实践,也为应用的监控和故障排查提供了强大的工具。强调一点,配置文件和代码的具体实现可能需要根据应用的实际需求和运行环境进行调优和修改,始终记住测试配置以确保一切运行正常。
697 0
|
5月前
|
运维 Java Apache
Java中的日志框架:Log4j与SLF4J详解
Java中的日志框架:Log4j与SLF4J详解
|
5月前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十八)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-下篇(详解教程)
【7月更文挑战第6天】本文介绍了如何使用Log4j2将日志输出到文件中,重点在于配置文件的结构和作用。配置文件包含两个主要部分:`appenders`和`loggers`。`appenders`定义了日志输出的目标,如控制台(Console)或其他文件,如RollingFile,设置输出格式和策略。`loggers`定义了日志记录器,通过`name`属性关联到特定的类或包,并通过`appender-ref`引用`appenders`来指定输出位置。`additivity`属性控制是否继承父logger的配置。
47 0
|
5月前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)
【7月更文挑战第5天】Apache Log4j 2是一个日志框架,它是Log4j的升级版,提供了显著的性能提升,借鉴并改进了Logback的功能,同时修复了Logback架构中的问题。Log4j2的特点包括API与实现的分离,支持SLF4J,自动重新加载配置,以及高级过滤选项。它还引入了基于lambda表达式的延迟评估,低延迟的异步记录器和无垃圾模式。配置文件通常使用XML,但也可以是JSON或YAML,其中定义了日志级别、输出目的地(Appender)和布局(Layout)。
52 0
|
6月前
|
设计模式 Java
Log4j 输出日志到 TextArea & JavaFX、Swing
Log4j 输出日志到 TextArea & JavaFX、Swing
下一篇
DataWorks