`

log4j使用整理材料(1)

阅读更多

一、前言

在我们的日常开发中,经常需要通过输出一些信息进行程序的调试,如果到处都用system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调试输出机制以解决输出的问题。log4j的原理是使用一个配置文件log4j.properties进行管理,在调试的时候可以把输出级别调低,项目正式发布之后把级别调高,这样以前的一些输出就可以屏蔽了,不用到程序当中再进行逐一删除。

log4j是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现,当时在log4j完成时,log4j开发组织曾建议sunjdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中实际使用最多的还是log4j,人们遗忘了sun的日志工具类。它的一个独有特性包括在类别中继承的概念。通过使用类别层次结构,这样就减少了日志记录输出量,并将日志记录的开销降到最低。

log4j允许开发者控制以任意间隔输出哪些日志语句。通过使用外部配置文件,完全可以在运行时进行配置。几乎每个大的应用程序都包括其自己的日志记录或跟踪 API。经验表明日志记录是开发周期中的重要组成部分。同样,日志记录提供一些优点。首先,它可以提供运行应用程序的确切 上下文。一旦插入到代码中,生成日志记录输出就不需要人为干涉。其次,日志输出可以保存到永久媒体中以便以后研究。最后,除了在开发阶段中使用,十分丰富的日志记录包还可以用作审计工具。

二、log4j的組成

    Log4主要有3部分组成: loggers, appenders layouts。这三种组件相互协调来保证开发人员可以根据日志信息的级别有选择地记录日志,而且使开发人员可以在不修改程序的情况下改变日志的记录格式和输出位置。logger是具体执行logging命令的对象, 可以指定等级(Level), 如果没有指定logger的等级,它会继承最近上一层logger的等级设置。appenderlog输出的目的地, 比如ConsoleAppenderlog输出到System.out或者System.err, FileAppenderlog输出到一个文件。layout指定输出的格式。

1、 loggers(日志器)  

配置根Logger,其语法为:                              

log4j.rootLogger = [ level ] , appenderName, appenderName, ...

1.1.1    级别(level                                                                代表日志的记录的级别。Loggers组件在此系统中被分为五个级别:DEBUGINFOWARNERRORFATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别QP高,则可以启动,否则屏蔽掉。 

1.1.2    级别的继承(Level Inheritance

每个日志器都必须有一个级别,如果没有为日志器指定级别,它就会从上级日志器那里继承一个级别。为了保证所有的日志器都有级别,根日志器必须有一个级别,缺省是输出所有日志。

1.1.3    输出目的地(appenderName

指定日志输出的目的地,可以是多个目的地。包括控制台、文件、数据库等。

例如:log4j. rootLogger =INFO,stdout,Runlog,Errorlog

根据日志类别为INFODEBUG将被屏蔽,其他的将被输出。 stdout,Runlog,Errorlog分别为3个输出目的地。

1.1.4    在源码中使用方法

在要输出的日志中添加如下的代码:

private final static Logger log=Logger.getLogger(className.class);

源码的例子:

import org.apache.log4j.Logger;

public class Log4jtest {

         private final static Logger

log = Logger.getLogger(Log4jtest.class);

   public static void main(String[] args) {

       log.info("日志输出信息测试");

   }

}

2、 appenders(追加器)  

指定输出目的地,语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class

1.1.5           appenderName 

输出的文件名字,它的名字是随便起的,为了编码的方便,要求它的名字最好和输出目的地有相近的例子。

1.1.6           fully.qualified.name.of.appender.class     

该项是要求输出的目的地类型, Log4J配置文件实现了输出到控制台、文件、 回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能类型:

log4j支持的输出目的地:

# 输出控制台的类型

org.apache.log4j.ConsoleAppender

# 输出文件的类型

org.apache.log4j.FileAppender

# 按天产生日志文件

org.apache.log4j.DailyRollingFileAppender

# 按大小产生文件

org.apache.log4j.RollingFileAppender

# 将日志信息以流格式发送到任意指定的地方

org.apache.log4j.WriterAppender

# 输出到邮件

org.apache.log4j.net.SMTPAppender 邮件

# 输出到数据库

org.apache.log4j.jdbc.JDBCAppender 数据库

3、 layout(布局)  

开发人员不但需要定义输出的目的地,还需要定义输出的格式。这通过给每个追加器定义一个布局来实现,布局负责将日志信息按用户的要求格式化,而追加器负责将格式化了的日志信息输出到目的地。对于每个起名了的追加器,我们都可以为它配置一个布局,配置追加器语法如下:

log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1=value1

....

log4j.appender.appenderName.layout.optionN=valueN

1.1.7           布局的定义类型   

Log4j提供了以下几种布局

# html表格形式布局

org.apache.log4j.HTMLLayout

# 可以灵活的指定布局模式

org.apache.log4j.PatterLayout

# 包含日志消息的级别和信息字符串

org.apache.log4j.SimpleLayout

# 包含日志产生的时间线程和类别

org.apache.log4j.TTCCLayout

1.1.8           布局输出方式

标准的log4j发布包中有一个PatternLayout包,它可以让用户用与C语言中printf方法相似的模式来指定输出格式。

具体如下:

 %p 输出优先级,即DEBUGINFOWARNERRORFATAL
 %r 输出自应用启动到输出该log信息耗费的毫秒数
 %c 输出所属的类目,通常就是所在类的全名
 %t 输出产生该日志事件的线程名
 %n 输出一个回车换行符,Windows平台为“\r\n”Unix平台为“\n”
 %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018 221028921
 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

详细的解释:

1c

输出日志器的名称,日志器的名称可能为X.Y.Z格式,所以在该格式的后面可以跟一个用大括号括起来的10进制数字,这个数字显示的日志器名称的精度。
在缺省条件下,该格式输出日志器的全名,一旦加上了精度,那么就从全名的右边输出N个部分。

例如:对于名为“a.b.c”的日志器,使用%c{2}将输出“b.c”。

2C

输出调用日志器的类的全名,与c相似,该格式也可以跟一个精度描述符。
例如:名为“org.apache.xyz.SomeClass”的类使用了日志器去记录日志,在日志的显示格式中使用%C{1}将输出“SomeClass”。

警告:生成调用类的信息是一项比较慢的工作。因此,最好在不关心运行速度的时候使用此格式。

3d

用于输出记录日志的时间,日期转换描述符可以跟一个时间格式的描述符,格式描述符放在一个大括号中,例如%d{HH:mm:ss,SSS}%d{dd MMM yyyy HH:mm:ss, SSS},如果没有指定日期格式,缺省将使用ISO8601格式。

格式描述符和SimpleDateFormat类中的时间格式字符串的语法相同:

Symbol   Meaning                 Presentation        Example

 ------   -------                 ------------        -------

 G        era designator          (Text)              AD

 y        year                    (Number)            1996

 M        month in year           (Text & Number)     July & 07

 d        day in month            (Number)            10

 h        hour in am/pm (1~12)    (Number)            12

 H        hour in day (0~23)      (Number)            0

 m        minute in hour          (Number)            30

 s        second in minute        (Number)            55

 S        millisecond             (Number)            978

 E        day in week             (Text)              Tuesday

 D        day in year             (Number)            189

 F        day of week in month    (Number)            2 (2nd Wed in July)

 w        week in year            (Number)            27

 W        week in month           (Number)            2

 a        am/pm marker            (Text)              PM

 k        hour in day (1~24)      (Number)            24

 K        hour in am/pm (0~11)    (Number)            0

 z        time zone               (Text)              Pacific Standard Time

 '        escape for text         (Delimiter)

 ''       single quote            (Literal)           '

使用与SimpleDateFormat相同的语法进行日期格式化在某些JDK上可能执行效率较低,所以一般推荐使用log4j自已的日期格式器(formatter),log4j提供三种日期格式器:AbsoluteTimeDateFormatDateTimeDateFormatISO8601DateFormat,可以分别通过它们对应的字符串“ABSOLUTE”、“DATE”、“ISO8601”来使用。例如,%d{ISO8601}%d{ABSOLUTE}

ABSOLUTE的格式:"HH:mm:ss,SSS",如 "15:49:37,459"

DATE的格式:"dd MMM YYYY HH:mm:ss,SSS" ,如"06 Nov 1994 15:49:37,459"

IOS8061的格式:"YYYY-mm-dd HH:mm:ss,SSS",如"1999-11-27 15:49:37,459"

使用这些给定的日志格式器要比使用SimpleDateFormat速度快。

编者:可能是log4j采取了特殊的取时间方法。

4F

输出记录日志操作所在的.java文件的文件名。

警告:生成调用类的信息是一项比较慢的工作。因此,最好在不关心运行速度的时候使用此格式。

5l

在写日志时将类中具体调用了写日志操作的位置输出到日志中。

所输出的位置信息依赖于JVM的实现,但是通常都由调用写日志操作的方法的方法名、该方法所在文件名以及行号组成。

警告:生成定位信息非常有用,但是生成的过程非常非常(extremely)慢,所以最好在不关心速度的情况下使用此格式。

6L

输出写日志操作所在的行号。

警告:生成调用者的位置信息极(extremely)慢,所以最好在不关心速度的情况下使用此格式。

7m

输出应用程序提供的信息,也就是我们输入的日志正文。

8M

输出写日志请求所在的方法的方法名。

警告:生成调用者的位置信息极(extremely)慢,所以最好在不关心速度的情况下使用此格式。

9n

根据平台输出换行符。

我们也可以直接根据平台使用”\n””\r\n”,但是这个格式转换符提供了和上述二种转换符相同的性能,所以它是执行换行的首选操作。

10p

用于输出日志信息的优先级信息。

11r

输出程序启动到写日志时经过的毫秒数。

12t

输出执行写日志操作的线程的名字。

13x

输出与写日志的线程相关的NDCnested diagnostic context)信息。

备注:具体功能研究中。

14%

用二个%%输出一个%

分享到:
评论

相关推荐

    老生常谈Log4j和Log4j2的区别(推荐)

    然后使用Logger.getLogger()方法获取日志记录器,而Log4j2需要import org.apache.logging.log4j.Level、org.apache.logging.log4j.LogManager和org.apache.logging.log4j.Logger,使用LogManager.getLogger()方法...

    log4j使用教程(详解)

    Log4j是一款广泛使用的开源日志框架,由Apache软件基金会开发。本文将深入探讨Log4j的基本概念、配置与使用方法。 1. **什么是Log4j** Log4j是一个基于Java的日志记录工具,它提供了灵活的控制来记录日志信息,...

    若依框架使用的log4j2.16.0,修复log4j漏洞log4j2下载最新log4j2.16.0下载

    Log4j是一个广泛使用的Java日志记录框架,它允许开发者在应用程序中轻松地记录各种级别的日志信息,如DEBUG、INFO、WARN、ERROR等。在2021年底,一个重大的安全漏洞(CVE-2021-44228)被发现在Log4j2的早期版本中,...

    logging-log4j2-log4j-2.15.0-rc2.zip maven 资源库

    针对Log4j 2 远程代码执行漏洞,需要用到的升级资源包,适用于maven资源库,包括log4j,log4j-core,log4j-api,log4j-1.2-api,log4j-jpa等全套2.15.0 maven资源库jar包。如果是maven本地仓库使用,需要将zip包解压...

    log4j简单使用

    - `log4j-1.2.14.jar`: 这是Log4j 1.2.14版本的jar包,包含了Log4j的全部类和方法,是使用Log4j进行日志记录的核心组件。 - `commons-logging-1.0.4.jar`: 这是Apache Commons Logging库,它是Java日志API的一个抽象...

    log4j.jar各个版本

    log4j-1.2rc1.jar, log4j-1.3alpha-7.jar, log4j-api-2.0.2-javadoc.jar, log4j-api-2.0.2-sources.jar, log4j-api-2.0.2.jar, log4j-boot.jar, log4j-bridge-0.9-sources.jar, log4j-bridge-0.9-tests.jar, log4j-...

    Log4j2简介及与Log4j效率对比

    Log4j2是Apache软件基金会推出的日志框架,它是Log4j 1.x的重构版本,旨在提供更为高效且灵活的日志解决方案。与Log4j 1.x相比,Log4j2在设计上进行了重大改进,并解决了Logback等其他日志框架中存在的某些体系结构...

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置使用 Log4j2 是一个功能强大且广泛使用的日志记录工具,它提供了灵活的日志记录机制和高性能的日志记录能力。Slf4j 则是一个简单的日志记录门面,提供了统一的日志记录接口。今天,我们将...

    log4j使用详解log4j使用详解

    ### Log4j 使用详解 #### 一、Log4j简介 Log4j 是 Apache 的一个开源项目,通过使用 Log4j,开发者能够控制日志信息的输出等级及去向,从而更加灵活地处理日志信息。它具有强大的功能,简单的配置,并且能够支持...

    SpringBoot框架配置log4j和log4j2的配置代码

    Log4j和Log4j2是两种广泛使用的Java日志框架,它们提供了灵活的日志配置和高性能的日志处理能力。本文将详细介绍如何在SpringBoot项目中配置Log4j和Log4j2。 ### SpringBoot与Log4j Log4j是Apache的一个开源项目,...

    log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码

    Log4j和SLF4J(Simple Logging Facade for Java)是两个广泛使用的日志框架,它们各有优势并常被一起使用以提供更灵活的日志解决方案。本文将详细探讨如何通过SLF4J接口来使用Log4j进行日志记录,并展示一个测试代码...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j、Log4j2和Fastjson的安全性问题在过去曾引起广泛关注,例如Log4j2的CVE-2021-44228(也被称为Log4Shell漏洞),这是一个远程代码执行漏洞,影响了许多使用Log4j2的系统。这个插件可能就是为了检测和利用这些...

    Log4j使用实例

    ### Log4j 使用实例详解 #### 一、Log4j简介 Log4j 是一个开源的日志记录框架,由 Apache 软件基金会提供。它允许开发者根据需求配置日志等级,并灵活选择日志信息的输出方式。Log4j 的核心组件包括 Logger、...

    Log4j2学习用到的jar包及apache-log4j-2.19.0-bin.zip

    分别有disruptor-3.3.4.jar(Log4j2异步日志的底层实现)、log4j-api-2.19.0.jar(log4j门面)、log4j-core-2.19.0.jar(log4j实现)、log4j-slf4j-impl-2.19.0.jar(SLF4J与Log4j绑定)、slf4j-api-1.7.30.jar(SLF...

    SSM整合中的Log4j日志的配置详情

    四、在 Maven 项目中引入 Log4j 依赖 在 Maven 项目中,需要引入 Log4j 依赖项,以便使用 Log4j。下面是一个基本的 Maven 依赖项配置: ``` &lt;groupId&gt;log4j &lt;artifactId&gt;log4j &lt;version&gt;1.2.16 ``` 这个配置...

    log4j使用详解 j2EE

    ### log4j使用详解 #### 一、log4j简介 Log4j是Apache的一个开源项目,用于实现日志功能,被广泛应用于各种基于Java的应用系统中。它提供了一个非常强大的框架来定制日志信息的生成方式,允许开发人员根据需要调整...

    log4j使用与java中log4j记录日志如何写入数据库

    1. **配置文件**:Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,它定义了日志的级别(如DEBUG、INFO、WARN、ERROR、FATAL)、输出目的地(控制台、文件、数据库等)以及布局格式。 2. **日志类**:在...

    log4j-2.18.0

    1. 确认当前使用的log4j2版本,如果是在受影响范围内,立即停止使用并准备升级。 2. 下载并部署log4j-2.18.0的更新版本,替换原有的库文件。 3. 配置更新后的log4j2,禁用可能导致问题的JNDI查找功能,增强系统安全...

    logging-log4j2-log4j-2.16.0-rc1.zip

    《Log4j 2.16.0-rc1:安全修复与重要更新》 在IT行业中,日志记录是系统监控、问题排查和性能分析的关键环节。Log4j作为Java平台广泛使用的日志框架,因其高效、灵活的特性而备受青睐。然而,任何软件都可能存在...

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    使用这两个JAR文件时,需要确保在应用程序的类路径中同时包含它们,以便正确运行Log4j 2框架。配置Log4j通常通过一个XML或JSON格式的配置文件完成,例如`log4j2.xml`或`log4j2.json`,这个文件定义了日志的输出级别...

Global site tag (gtag.js) - Google Analytics