八十六、Log4j与Log4j2 你真的明白了吗?
一个完整的软件,日志是必不可少的。程序从开发、测试、维护、运行等环节,都需要向控制台或文件等位置输出大量信息。这些信息的输出, 在很多时候是使用System.out.println()无法完成的。
日志信息根据用途与记录内容的不同,分为调试日志、运行日志、异常日志等。用于日志记录的技术很多,如 jdk 的 logger 技术,apache 的 log4j、log4j2 技术等。
Log4j 的全称为 Log for java,即,专门用于 java 语言的日志记录工具。其目前有两个版本:Log4j 与 Log4j2。
目录
Log4j的下载
日志级别
日志输出控制文件
在程序中的日志实现步骤
日志输出控制文件分析
定义日志附加器appender
修饰日志附加器
配置根logger
日志实现步骤

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

日志级别
为了方便对于日志信息的输出显示,对日志内容进行了分级管理。日志级别由高到低 , 共分 6 个级别:fatal(致命的)、error、warn、info、debug、trace(堆栈)。
为什么要对日志进行分级呢?
无论是将日志输出到控制台,还是文件,其输出都会降低程序的运行效率。但由于调试、运行维护的需要,客户的要求等原因,需要进行必要的日志输出。这时就必须要在代码中加入日志输出语句。
这些输出语句若在程序运行时全部执行, 则势必会降低运行效率。例如, 使用System.out.println()将信息输出到控制台,则所有的该输出语句均将执行。会大大降低程序的执行效率。而要使其不输出,唯一的办法就是将这些输出语句逐个全部删除。这是个费时费力的过程。
将日志信息进行分级管理,便可方便的控制信息输出内容及输出位置:哪些信息需要输出,哪些信息不需要输出,只需在一个日志输出控制文件中稍加修改即可。而代码中的输出语句不用做任何修改。
从这个角度来说,代码中的日志编写,其实就是写大量的输出语句。只不过,这些输出语句比较特殊,它们具有级别,在程序运行期间不一定被执行。它们的执行是由另一个控制文件控制。
日志输出控制文件
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 代码中的日志记录器,其主要由两个属性构成:日志输出级别与日志附加器。
日志附加器,则由日志输出位置定义,由其它很多属性进行修饰,如输出布局、文件位置、文件大小等。

定义日志附加器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:每天产生一个日志文件
修饰日志附加器
所谓修饰日志附加器,就是为定义好的附加器添加一些属性,以控制到指定位置的输出。
不同的附加器,其修饰属性不同。
(1)控制台附加器:

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

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 包:

(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)
标签
标签的 status 属性用于设置 Log4j2 自身运行的日志显示级别,一般为OFF,不显示。当然,也可以设置为 ERROR、DEBUG 等其它级别。 (2)
标签
标签的 target 属性用于设置输出的目标形式,其值一般为:SYSTEM_OUT 或 SYSTEM_ERR
(3)
标签
标签的 fileName 属性用于设置文件的文件保存路径及文件名。如本例的意思是, 日志文件名为 test.log,将其存放在当前项目的根目录下的 log 子目录中。 append 属性用于设置是否以追加方式将日志写入指定文件。
标签的 子标签用于指定每一个日志文件最大文件大小。当达到这个指定值后,会自动再新建一个日志文件。 (4)
标签 fileName 指定存放目录及第一个日志文件名。filePattern 指定新创建的日志文件的文件名。本例还会对文件进行压缩。
(5)
标签 用于配置根 Logger 对象,以指定所使用的日志记录器,及显示的级别。
其子标签
用于指定所使用的日志记录器。该子标签的属性 level 用于指定显示级别。而日志记录器是通过 的子标签 来引用 中定义好的记录器的。 需要注意的是,只要在
中定义了 、 等,且在其中指定了日志存放的目录,那么这些目录就会自动创建。无论在 的 中是否声明使用它们。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!




