一、前言
在我们的日常开发中,经常需要通过输出一些信息进行程序的调试,如果到处都用system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调试输出机制以解决输出的问题。log4j的原理是使用一个配置文件log4j.properties进行管理,在调试的时候可以把输出级别调低,项目正式发布之后把级别调高,这样以前的一些输出就可以屏蔽了,不用到程序当中再进行逐一删除。
log4j是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现,当时在log4j完成时,log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中实际使用最多的还是log4j,人们遗忘了sun的日志工具类。它的一个独有特性包括在类别中继承的概念。通过使用类别层次结构,这样就减少了日志记录输出量,并将日志记录的开销降到最低。
log4j允许开发者控制以任意间隔输出哪些日志语句。通过使用外部配置文件,完全可以在运行时进行配置。几乎每个大的应用程序都包括其自己的日志记录或跟踪 API。经验表明日志记录是开发周期中的重要组成部分。同样,日志记录提供一些优点。首先,它可以提供运行应用程序的确切 上下文。一旦插入到代码中,生成日志记录输出就不需要人为干涉。其次,日志输出可以保存到永久媒体中以便以后研究。最后,除了在开发阶段中使用,十分丰富的日志记录包还可以用作审计工具。
二、log4j的組成
Log4主要有3部分组成: loggers, appenders 和layouts。这三种组件相互协调来保证开发人员可以根据日志信息的级别有选择地记录日志,而且使开发人员可以在不修改程序的情况下改变日志的记录格式和输出位置。logger是具体执行logging命令的对象, 可以指定等级(Level), 如果没有指定logger的等级,它会继承最近上一层logger的等级设置。appender是log输出的目的地, 比如ConsoleAppender将log输出到System.out或者System.err, FileAppender将log输出到一个文件。layout指定输出的格式。
1、 loggers(日志器)
配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, ...
1.1.1 级别(level) 代表日志的记录的级别。Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高,则可以启动,否则屏蔽掉。
1.1.2 级别的继承(Level Inheritance)
每个日志器都必须有一个级别,如果没有为日志器指定级别,它就会从上级日志器那里继承一个级别。为了保证所有的日志器都有级别,根日志器必须有一个级别,缺省是输出所有日志。
1.1.3 输出目的地(appenderName)
指定日志输出的目的地,可以是多个目的地。包括控制台、文件、数据库等。
例如:log4j. rootLogger =INFO,stdout,Runlog,Errorlog
根据日志类别为INFO,DEBUG将被屏蔽,其他的将被输出。 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 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
详细的解释:
1、c
输出日志器的名称,日志器的名称可能为X.Y.Z格式,所以在该格式的后面可以跟一个用大括号括起来的10进制数字,这个数字显示的日志器名称的精度。
在缺省条件下,该格式输出日志器的全名,一旦加上了精度,那么就从全名的右边输出N个部分。
例如:对于名为“a.b.c”的日志器,使用%c{2}将输出“b.c”。
2、C
输出调用日志器的类的全名,与c相似,该格式也可以跟一个精度描述符。
例如:名为“org.apache.xyz.SomeClass”的类使用了日志器去记录日志,在日志的显示格式中使用%C{1}将输出“SomeClass”。
警告:生成调用类的信息是一项比较慢的工作。因此,最好在不关心运行速度的时候使用此格式。
3、d
用于输出记录日志的时间,日期转换描述符可以跟一个时间格式的描述符,格式描述符放在一个大括号中,例如%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提供三种日期格式器:AbsoluteTimeDateFormat、DateTimeDateFormat和ISO8601DateFormat,可以分别通过它们对应的字符串“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采取了特殊的取时间方法。
4、F
输出记录日志操作所在的.java文件的文件名。
警告:生成调用类的信息是一项比较慢的工作。因此,最好在不关心运行速度的时候使用此格式。
5、l
在写日志时将类中具体调用了写日志操作的位置输出到日志中。
所输出的位置信息依赖于JVM的实现,但是通常都由调用写日志操作的方法的方法名、该方法所在文件名以及行号组成。
警告:生成定位信息非常有用,但是生成的过程非常非常(extremely)慢,所以最好在不关心速度的情况下使用此格式。
6、L
输出写日志操作所在的行号。
警告:生成调用者的位置信息极(extremely)慢,所以最好在不关心速度的情况下使用此格式。
7、m
输出应用程序提供的信息,也就是我们输入的日志正文。
8、M
输出写日志请求所在的方法的方法名。
警告:生成调用者的位置信息极(extremely)慢,所以最好在不关心速度的情况下使用此格式。
9、n
根据平台输出换行符。
我们也可以直接根据平台使用”\n”或”\r\n”,但是这个格式转换符提供了和上述二种转换符相同的性能,所以它是执行换行的首选操作。
10、p
用于输出日志信息的优先级信息。
11、r
输出程序启动到写日志时经过的毫秒数。
12、t
输出执行写日志操作的线程的名字。
13、x
输出与写日志的线程相关的NDC(nested diagnostic context)信息。
备注:具体功能研究中。
14、%
用二个%%输出一个%。
分享到:
相关推荐
7. **日志记录**:Log4j或SLF4J的日志处理。 8. **实用工具类**:日期时间处理、字符串操作、文件操作等。 最后,"下载及使用说明.txt"可能是对资源的下载和使用进行指导,而"更多Java资料学习.url"则可能指向一个...
项目可能集成了Log4j、Logback或SLF4J等日志框架,记录系统运行时的事件。 10. **单元测试与持续集成**:为了保证代码质量,项目应该包含完善的单元测试,可能使用JUnit、Mockito等工具。同时,持续集成工具如...
通过slf4j,你可以选择任何你喜欢的日志实现(如log4j、logback等),而无需修改代码。在实际项目中,合理地利用日志系统,能够有效地排查问题,提高开发效率。 在学习这个资源包时,你需要逐步掌握以下内容: 1. ...
在工具和技术应用上,他熟练运用JUnit进行调试,使用log4j进行日志管理,掌握SVN进行项目整合,熟悉MyBatis进行数据库管理。他还了解Tomcat、Apache服务器配置,并能熟练使用MyEclipse和Eclipse等开发工具。在实际...
* 熟练运用 JUnit,Debug 进行程序调试、log4j 进行日志管理、SVN 项目整合、MyBatis 数据库管理 * 熟悉 Tomcat、Apache 等服务器配置 项目经验 * 伟业网上电商系统 + 软件环境:Oracle10g、Tomcat7.0、Struts 2.0...
- **软件工具**:熟练使用JUnit进行程序调试、log4j进行日志管理、SVN进行项目整合、MyBatis进行数据库管理。 - **服务器配置**:熟悉Tomcat、Apache等服务器配置。 - **开发工具**:熟练掌握MyEclipse/Eclipse等...
- 指数和对数:`exp`, `log`, `log10`, `sqrt`,以及复数函数 `abs`, `angle`, `conj`, `imag`, `real`。 - 数值处理:`fix`, `floor`, `ceil`, `round`, `rem`, `sign` 等用于处理数值。 - 随机数生成:`zeros`,...
10. **监控与日志**:使用Actuator进行应用性能监控,以及Logback、Log4j2的日志管理。 11. **云原生支持**:Docker容器化、Kubernetes编排、Cloud Foundry平台集成。 12. **前端技术**:Vue.js、React、Angular等...