基于Java的开源日志库log4j调研笔记
2015-04-30 17:51
429 查看
由于Hadoop生态链基本都是java开发的,所以在很多有关大数据处理的开源项目中,经常会看到log4j这个jar包。
本文旨在对它的用法做基本说明。
1. log4j是什么
从log4j的命名(log for java)不难看出,它是为java提供的日志库。具体而言,它是Apache基金会下的开源项目,它可在不修改应用程序代码的前提下,在程序运行时提供灵活的日志打印功能(当然,应用程序还是必须在代码中调用log4j进行打印,但程序发布后,可以通过配置文件控制日志输出目的地及允许输出的日志等级)。
不管用哪种语言开发的应用,大量的verbose日志总是会降低程序性能,不过,log4j在设计/实现时已经做了很多优化以便尽量减少对应用程序的性能影响,它的宗旨是"speed first, flexibility second",关于log4j性能方面需考虑的问题,可参考这里的说明。
关于log4j的更多特性,可以通过查看log4j FAQ来了解:What are the features of log4j?"
2. log4j的三要素
log4j存在3个重要概念:loggers, appenders和layouts,这3个要素使得引入log4j库的开发者可以灵活控制打印行为,如日志等级、日志内容、日志格式及打印目的地(如本地或远程打印),等等。
2.1 loggers
事实上,loggers是一些大小写敏感的命名实体,这些实体的命名遵循如下的层级命名规则(细节可查看文档Short introduction to log4j):
A logger is said to be an ancestor of another logger if its name followed by a dot is a prefix of the descendant logger name. A logger is said to be a parent of a child logger if there
are no ancestors between itself and the descendant logger.
在loggers的层级结构中,root logger处于最顶级。使用log4j库时,root logger必须被创建且只能通过类静态方法Logger.getRootLogger来创建,而其它logger可以通过传入logger name调用类静态方法Logger.getLogger来实例化。
可以为logger实例指定日志等级(如通过setLevel接口),目前支持这些常用等级:TRACE, DEBUG, INFO, WARN, ERROR, FATAL。不考虑TRACE,其余等级的重要程度依次为:DEBUG < INFO < WARN < ERROR < FATAL。
若某个logger实例没有显式指定等级,则它会继承距离它最近的、被显式指定过日志等级的父logger实例的等级。
一旦为某个logger实例指定了等级,则调用该实例打印日志时,只有日志等级不小于指定等级的日志会被打印,低于指定等级的日志不会被打印出来。这个规则是log4j库的核心规则,它保证了日志等级的灵活控制。
2.2 appenders
appenders其实就是日志打印的目的地址(In log4j speak, an output destination is called an appender),目前支持的appenders包括:console, files, GUI components, remote socket servers, JMS, NT Event
Loggers, and remote UNIX Syslog daemons。
一个logger实例可以有多个appender(s),即同一条日志可以同时打印到多个目的地。
默认情况下,某logger实例的日志打印请求会打印到已为该logger实例添加的所有appenders上,此外,该日志打印请求还会沿着logger实例的层级继承链向上传播给其祖先logger的所有appenders。
例如,为root logger添加console类型的appender后,root logger的日志打印请求会输出到console,这很容易理解。现在假设logger实例C继承自root,且为实例C添加了file类型的appender,则调用实例C进行日志打印时,除file appender会输出日志外,实例C的祖先,即本例中的root
logger也会收到该日志打印请求,由于root logger添加了console appender,所以,console appender也会输出日志。这个默认行为可以通过将logger的additive字段设置为false来关闭。
关于appender additivity的更多说明及示例,可以参考Short introduction to log4j这篇文档关于Appender部分的说明。
2.3 layouts
layouts可以指定日志的格式,支持的PatternLayout在文档log4j - Class PatternLayout中有详细说明,这里不赘述。
3. log4j的配置
log4j日志库的配置可以在java程序中通过代码指定,也可以通过配置文件来指定并随着java应用的启动被初始化。显然后者更加灵活。
下面是一个典型的log4j配置文件:
4. log4j库的初始化过程
log4j不对它的使用场景做任何假设,因此,它没有默认的appender,也即,appender必须由使用者显式配置。引用了log4j库的java进程启动时,JVM的classloader机制会对应用程序引用到的Logger类进行加载,而该类的静态初始化函数会尝试自动配置log4j。log4j库默认的初始化过程在文档Short
introduction to log4j的"Default Initialization Procedure"部分有详细说明,感兴趣的同学可以去查看。
备注:关于JVM加载class(如系统包或第3方扩展包)的机制,可以通过下面几篇文档来理解:
1)
Understanding the Java Classloading Mechanism
2)
Understanding Extension Class Loading
3)
Internals of Java Class Loading
【参考资料】
1. log4j FAQ:
What are the features of log4j?
2.
Short introduction to log4j: Ceki Gülcü, March 2002
3. log4j docs:
Class PatternLayout
4.
Understanding the Java Classloading Mechanism
5. Java Docs: Understanding Extension Class Loading
6.
Internals of Java Class Loading
========================= EOF ========================
本文旨在对它的用法做基本说明。
1. log4j是什么
从log4j的命名(log for java)不难看出,它是为java提供的日志库。具体而言,它是Apache基金会下的开源项目,它可在不修改应用程序代码的前提下,在程序运行时提供灵活的日志打印功能(当然,应用程序还是必须在代码中调用log4j进行打印,但程序发布后,可以通过配置文件控制日志输出目的地及允许输出的日志等级)。
不管用哪种语言开发的应用,大量的verbose日志总是会降低程序性能,不过,log4j在设计/实现时已经做了很多优化以便尽量减少对应用程序的性能影响,它的宗旨是"speed first, flexibility second",关于log4j性能方面需考虑的问题,可参考这里的说明。
关于log4j的更多特性,可以通过查看log4j FAQ来了解:What are the features of log4j?"
2. log4j的三要素
log4j存在3个重要概念:loggers, appenders和layouts,这3个要素使得引入log4j库的开发者可以灵活控制打印行为,如日志等级、日志内容、日志格式及打印目的地(如本地或远程打印),等等。
2.1 loggers
事实上,loggers是一些大小写敏感的命名实体,这些实体的命名遵循如下的层级命名规则(细节可查看文档Short introduction to log4j):
A logger is said to be an ancestor of another logger if its name followed by a dot is a prefix of the descendant logger name. A logger is said to be a parent of a child logger if there
are no ancestors between itself and the descendant logger.
在loggers的层级结构中,root logger处于最顶级。使用log4j库时,root logger必须被创建且只能通过类静态方法Logger.getRootLogger来创建,而其它logger可以通过传入logger name调用类静态方法Logger.getLogger来实例化。
可以为logger实例指定日志等级(如通过setLevel接口),目前支持这些常用等级:TRACE, DEBUG, INFO, WARN, ERROR, FATAL。不考虑TRACE,其余等级的重要程度依次为:DEBUG < INFO < WARN < ERROR < FATAL。
若某个logger实例没有显式指定等级,则它会继承距离它最近的、被显式指定过日志等级的父logger实例的等级。
一旦为某个logger实例指定了等级,则调用该实例打印日志时,只有日志等级不小于指定等级的日志会被打印,低于指定等级的日志不会被打印出来。这个规则是log4j库的核心规则,它保证了日志等级的灵活控制。
2.2 appenders
appenders其实就是日志打印的目的地址(In log4j speak, an output destination is called an appender),目前支持的appenders包括:console, files, GUI components, remote socket servers, JMS, NT Event
Loggers, and remote UNIX Syslog daemons。
一个logger实例可以有多个appender(s),即同一条日志可以同时打印到多个目的地。
默认情况下,某logger实例的日志打印请求会打印到已为该logger实例添加的所有appenders上,此外,该日志打印请求还会沿着logger实例的层级继承链向上传播给其祖先logger的所有appenders。
例如,为root logger添加console类型的appender后,root logger的日志打印请求会输出到console,这很容易理解。现在假设logger实例C继承自root,且为实例C添加了file类型的appender,则调用实例C进行日志打印时,除file appender会输出日志外,实例C的祖先,即本例中的root
logger也会收到该日志打印请求,由于root logger添加了console appender,所以,console appender也会输出日志。这个默认行为可以通过将logger的additive字段设置为false来关闭。
关于appender additivity的更多说明及示例,可以参考Short introduction to log4j这篇文档关于Appender部分的说明。
2.3 layouts
layouts可以指定日志的格式,支持的PatternLayout在文档log4j - Class PatternLayout中有详细说明,这里不赘述。
3. log4j的配置
log4j日志库的配置可以在java程序中通过代码指定,也可以通过配置文件来指定并随着java应用的启动被初始化。显然后者更加灵活。
下面是一个典型的log4j配置文件:
log4j.rootLogger=debug, stdout, R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n该配置文件中,只指定了1个logger实例(即root logger),其最低日志等级是DEBUG,添加了2个appender(分别命名为stdout和R)。然后为两个appender name分别指定了log4j真正支持的appender(分别为ConsoleAppender和RollingFileAppender),每个appender均可以通过layout指定各自的日志格式。
4. log4j库的初始化过程
log4j不对它的使用场景做任何假设,因此,它没有默认的appender,也即,appender必须由使用者显式配置。引用了log4j库的java进程启动时,JVM的classloader机制会对应用程序引用到的Logger类进行加载,而该类的静态初始化函数会尝试自动配置log4j。log4j库默认的初始化过程在文档Short
introduction to log4j的"Default Initialization Procedure"部分有详细说明,感兴趣的同学可以去查看。
备注:关于JVM加载class(如系统包或第3方扩展包)的机制,可以通过下面几篇文档来理解:
1)
Understanding the Java Classloading Mechanism
2)
Understanding Extension Class Loading
3)
Internals of Java Class Loading
【参考资料】
1. log4j FAQ:
What are the features of log4j?
2.
Short introduction to log4j: Ceki Gülcü, March 2002
3. log4j docs:
Class PatternLayout
4.
Understanding the Java Classloading Mechanism
5. Java Docs: Understanding Extension Class Loading
6.
Internals of Java Class Loading
========================= EOF ========================
相关文章推荐
- 转载 log4j笔记 日志操作之JAVA-Apache
- java开源项目之IQQ学习记录之单例模式与log4j日志记录
- java开源项目之IQQ学习记录之单例模式与log4j日志记录
- java开源项目之IQQ学习记录之单例模式与log4j日志记录
- Java学习笔记(十九)——Java 日志记录 AND log4j
- Java log4j slf4j 日志配置笔记
- java解析XML配置文件及log4j开源日志系统
- java中开源日志记录工具log4j
- Java_log4j_使用开源日志记录工具log4j
- Java 基于log4j的日志工具类
- 浅谈Java项目日志记录和分析 (基于log4j介绍)
- Java 基于log4j的日志工具类
- Java 基于log4j的日志工具类
- Java日志框架源码学习笔记(二)
- java日志系统--log4j初识用法
- java日志组件介绍(common-logging,log4j,slf4j,logback )
- JAVA中使用LOG4J记录日志
- Java使用log4j进行日志管理
- Java开源框架 iBase4J 搭建笔记
- Java项目添加log4j日志文件错误记录