欢迎光临散文网 会员登陆 & 注册

深入解析SSH框架——Log4j与Log4j2

2021-03-25 13:34 作者:动力节点小王本王  | 我要投稿



Log4j  Log4j2

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

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

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

Log4j 基础

  • Log4j 的下载

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

1Log4j 版本下载

2Logfj2 版本下载

日志级别

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

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

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

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

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

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

日志输出控制文件

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

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

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

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

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

Log4j 技术

在程序中的日志实现步骤

项目:log4j

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

(1) 导入 Jar 包

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

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

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

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

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

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

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

日志输出控制文件分析

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

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

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

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

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

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

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

置、文件大小等。

1定义日志附加器 appender

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

appenderName 为自定义名称。

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

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

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

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

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

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

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

2)修饰日志附加器

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

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

  • 控制台附加器:

Target:控制输出到控制台的使用目标。其值为 System.out  或 Sytem.err。它们的区别是, System.out 是以黑色字体显示到控制台,而 System.err 则是以红色字体显示。

  • 文件附加器:

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

  • 滚动文件附加器:

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

Log4j 常用布局类型:

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

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

  • org.apache.log4j.PatternLayout:匹配器布局,可以灵活地指定布局模式。其主要是通过设置 PatternLayout 的 ConversionPattern 属 性 值 来 控 制 具 体 输 出 格 式 的 。ConversionPattern 的值中有很多控制字符,这些字符的意义如下表所示:

    ConversionPattern 取值说明

                                                                                                      (本表格来自互联网)

3)配置根 Logger

配置rootLogger,以便于代码加载来控制日志的输出。其语法为: log4j.rootLogger = [ level ] , appenderName, …

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

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

Log4j2 技术

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

在程序中的日志实现步骤

项目:log4j2

(1)导入 Jar 包

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

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

将文件 log4j2.xml 直接放到项目的 src 下。log4j2 配置文件是 XML 文件,不再支持

properties 文件。默认的文件名为 log4j2.xml。其存放的位置为 classpath 中。

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

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

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

包中的。

日志输出控制文件分析

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

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

配置文件说明:

1<configuration/>标签

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

2<Console/>标签

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

SYSTEM_OUT 或 SYSTEM_ERR

(3)<File/>标签 

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

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

(4)<RollingFile/>标签 

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

(5) <loggers/>标签

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

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

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

slf4j 日志框架

在学习 Java 框架过程中,对于 Log4j 的使用,主要是为了使代码运行过程中输出较多的提示,以便于调试。并非自己编写日志。

为了使框架具有一般性,框架对于日志的支持,一般不指定具体的日志实现技术,而是使用了一个日志框架 slf4j。通过slf4j,可以让程序员自己确定使用具体的哪种日志实现技术。Java 中的很多框架都是使用的slf4j,即这些框架中的日志代码都是使用的slf4j的API 处理日志的。

slf4j,Simple Logging Facade for Java,简单日志门面。其不是具体的日志解决方案,不做具体的日志服务。它仅仅是一种规范,一个接口。而Log4j 则是slf4j的一种具体实现,提供具体的日志服务。

slf4j 有自己单独的一套 API,这套API 与具体的日志实现技术的 API 是不同的。为了能使 slf4j 的 API 与具体日志实现技术 API 结合到一起,在 slf4j 与具体日志技术之间,还需要一个连接的 jar。这个 jar 在 sfl4j 框架中存放着。

最后奉上视频教程👇,视频观看效果更佳!!走过路过别忘素质三连哦~~


深入解析SSH框架——Log4j与Log4j2的评论 (共 条)

分享到微博请遵守国家法律