Log4J学习总结
Log4J 学习笔记
l 什么是log4j?
Log4J 是Apache 的一个开源项目,是一个在我们编写代码过程提供实现日志输出功能的包。Log4J 可以实现通过配置的方式日志输出、日志目的地定义、日志格式定义 等功能,有效的管理日志。在使用Log4J 之前先看一下几个概念:
l log4j 基本概念
在使用Log4j 之前,先看看3 个基本概念:Looger,Appender,PatternLayout
三者关系如下:
图1:Logger,Appender,PatternLayout关系图
1.Logger : 日志输出器,提供输出日志功能。
Log4J 内置了7 中Log 等级,从低到高分别为ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF 。每个Logger 都要默认定义一个等级。同时对于每一条要输出的日志也定义了等级,不同等级的日志用不同的方法调用,共5 种等级(DEBUG, INFO, WARN, ERROR, FATAL), 通过如下方法写出日志:
Logger logger=Logger.getLogger( “logname ”);
logger.info(“…”);
logger.error(“…”);
logger.debug(“…”);
logger.warn(“…”);
logger.fatal(“…”);
如果日志的等级高于等于日志输出器的等级,那么该日志才会被写入。
2.Appender : 日志目的地,用来定义日志目的地对象。
在日志写出之前还必须先定义好日志器对应的日志目的地。一个日志器可以定义多个目的地。日志目的地有多种类型。其结构如下:
图2:Appender结构图
其中Appender 是顶层接口,下面定义了很多种Appender ,几种常见的Appender 解释如下:
ConsoleAppender: 控制台作为日志输出地
FileAppender: 文件作为日志输出地
RollingFileAppender: 日志文件的大小受到限制,当内容超出最大的限制时,该文件将向上滚动。
其他的类型笔者也未曾深入研究。
3.PatternLayout :日志布局,用于定义日志格式。
定义日志布局,指定在日志输出到目的地的时候以怎样的格式被输出。
l 3. 如何使用Log4J
无论你是否创建 logger , Log4J 都会默认创建一个 RootLogger ,该日志器可以通过 Logger.getRootLogger() 获得。所以的 logger 都将继承该根 Logger.
在使用 Log4j 进行日志记录之前必须先初始化 Log4J 配置,配置可以包含如下工作:
定义日志器 logger ,如:
定义指定 Layout 的 appender
定义 logger 对应的 appender 。
Log4j 可以通过如下两种方式进行初始化
a. 默认配置
org.apache.log4j.BasicConfigurator .configure ();
它将完成如下工作:
-
用默认
pattern
创建
PatternLayout
对象
p
:
PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n"); -
用
p
创建
ConsoleAppender
对象
a
,目标是
system.out
,标准输出设备:
ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT); -
为
root logger
增加一个
ConsoleAppender p
:
rootLogger.addAppender(p); -
把
root logger
的
log level
设置为
DEBUG
级别:
rootLogger.setLevel(Level.DEBUG);
b. 自定义配置
这个是比较推荐也比较常用的一种配置。可以将配置定义在程序之外,在程序之外控制日志系统的运行。主要通过 XML 文件配置。由 org.apache.log4j.xml.DOMConfigurator.configure() 方法读入配置并初始化。 org/apache/log4j/xml/log4j.dtd 里定义了 XML 文件的语法。下面简单介绍如何在 XML 文件里定义 Logger , Appender , root 配置及两者关系等。
定义 Logger( 注:同名的 logger 在 Log4J 里只会有一个对象 。 ) :
< logger name = "fileLogger" > logger 名称 < level value = "debug" /> logger 级别 < appender-ref ref = "file.log" /> logger 对应的 appender </ logger > 定义 appender: < appender name = "file.log" class = "org.apache.log4j.FileAppender" > < param name = "File" value = "/tmp/log.txt" /> 对应文件 < param name = "Append" value = "false" /> 每次是否清空 < layout class = "org.apache.log4j.PatternLayout" > 日志格式 < param name = "ConversionPattern" value = "%d [%t] %p - %m%n" /> </ layout > </ appender > Root 配置 < root > < level value = "debug" /> < appender-ref ref = "console.log" /> </ root >
以上是关于 Log4J 的一些概念和使用介绍。下面举两个简单例子说明:
例子 1 : 使用 BasicConfigurator.congigure() 初始化
Log4JTest.java:
import org.apache.log4j.Level; import org.apache.log4j.Logger; public class Log4JTest { public static void main(String argv[]) { // Create a logger by the name of class Log4jTest. Logger logger = Logger.getLogger (Log4JTest. class ); // Use the default configuration. org.apache.log4j.BasicConfigurator.configure (); // Set the logger level to Level.INFO logger.setLevel(Level. INFO ); // This request will be disabled since Level.DEBUG < Level.INFO. logger.debug( "This is debug." ); // These requests will be enabled. logger.info( "This is an info." ); logger.warn( "This is a warning." ); logger.error( "This is an error." ); logger.fatal( "This is a fatal error." ); return ; } }
例子 2 : 使用 XML 文件配置
Log4j_config.XML:
<? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > < log4j:configuration xmlns:log4j = "http://jakarta.apache.org/log4j/" > <!-- a file appender --> < appender name = "file.log" class = "org.apache.log4j.FileAppender" > < param name = "File" value = "/tmp/log.txt" /> < param name = "Append" value = "false" /> < layout class = "org.apache.log4j.PatternLayout" > < param name = "ConversionPattern" value = "%d [%t] %p - %m%n" /> </ layout > </ appender > <!-- a roll appender --> < appender name = "file_roll.log" class = "org.apache.log4j.RollingFileAppender" > < param name = "File" value = "/tmp/fileRoll.log" /> < param name = "Append" value = "false" /> < layout class = "org.apache.log4j.PatternLayout" > < param name = "ConversionPattern" value = "%d [%t] %p - %m%n" /> </ layout > </ appender > <!-- a console appender --> < appender name = "console.log" class = "org.apache.log4j.ConsoleAppender" > < layout class = "org.apache.log4j.PatternLayout" > < param name = "ConversionPattern" value = "%d [%t] %p - %m%n" /> </ layout > </ appender > < logger name = "fileLogger" > < level value = "debug" /> < appender-ref ref = "file.log" /> </ logger > <!-- root loger . --> < root > < level value = "debug" /> < appender-ref ref = "console.log" /> </ root > </ log4j:configuration >
Log4JXMLTest.java:
import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; public class Log4JXMLTest { public static void main(String args[]) { DOMConfigurator.configure("log4j_config.xml"); Logger fileLogger = Logger.getLogger("fileLogger"); fileLogger.setLevel(Level.ALL); fileLogger.debug("i just make a test!"); Logger.getRootLogger(); } }
以上是关于 Log4J 的一些基本介绍,笔者认为日志对一个应用的作用应该是巨大的,当然也会带来一定的系统开销,但是这是值得的。同时 Log4J 提供的可配置的日志系统管理,方便易用,推荐大家使用。