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[]) {
-
-
- Logger logger = Logger.getLogger (Log4JTest. class );
-
-
- org.apache.log4j.BasicConfigurator.configure ();
-
-
- logger.setLevel(Level. INFO );
-
-
- logger.debug( "This is debug." );
-
-
- 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" ?>
- >
-
- < log4j:configuration xmlns:log4j = "" >
-
-
- < 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 >
-
- < 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 >
-
- < 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 >
- < 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
提供的可配置的日志系统管理,方便易用,推荐大家使用。
阅读(638) | 评论(0) | 转发(0) |