log4j学习札记

来源:互联网 发布:mac自带的画图软件 编辑:程序博客网 时间:2024/05/18 02:02

Log四j的类图

Logger - 日记写出器,供程序员输出日记信息
Appender - 日记目的地,把格式化好的日记信息输出到指定的地方去
ConsoleAppender - 目的地为控制台的Appender
FileAppender - 目的地为资料的Appender
RollingFileAppender - 目的地为大小受限的资料的Appender
Layout - 日记格式化器,用于把程序员的logging request格式化成字符串
PatternLayout - 用指定的pattern格式化logging request的Layout

Logger:日记写出器
Logger对像样用以取代System.out也许System.err的日记写出器,用以供程序员输出日记信息。

Logger的输出步骤
Logger种对象提供一连串步骤供程序员输出日记信息。

Java代码
------ Log四j APIs : class Logger ------

// Printing methods :

public void debug(Object msg);
public void debug(Object msg, Throwable t);

public void info(Object msg);
public void info(Object msg, Throwable t);

public void warn(Object msg);
public void warn(Object msg, Throwable t);

public void error(Object msg);
public void error(Object msg, Throwable t);

public void fatal(Object msg);
public void fatal(Object msg, Throwable t);

// Generic printing method :

public void log(Level l, Object msg);

------ Log四j APIs : class Logger ------

// Printing methods :

public void debug(Object msg);
public void debug(Object msg, Throwable t);

public void info(Object msg);
public void info(Object msg, Throwable t);

public void warn(Object msg);
public void warn(Object msg, Throwable t);

public void error(Object msg);
public void error(Object msg, Throwable t);

public void fatal(Object msg);
public void fatal(Object msg, Throwable t);

// Generic printing method :

public void log(Level l, Object msg);
Logger的定名守则
Logger由一个String种的名字辨别,logger的名字是大小写敏感的,且名字其间具有承继的关系,子名有父名篇为前缀,用点号.分隔。如:x.y是x.y.z的爸爸。根logger (root logger)是全部logger的先祖,它具如同部属性:一) 它老是存在的;二) 它不可以经过名字取得。经过调用public static Logger Logger.getRootLogger()取得root logger;透过调用public static Logger Logger.getLogger(String name)可能public static Logger Logger.getLogger(Class clazz)取得(也许创设)一个named logger。后者等同于调用Logger.getLogger(clazz.getName())。在某对象中,用该对象分属的种为参数,调用Logger.getLogger(Class clazz)以取得logger被认为是现阶段所知的最明智的定名logger的步骤。

Log level
每个logger都被分配了一个日记级别 (log level),用于统制日记信息的输出。未被分配level的logger将承继它日前的父logger的level。每条输出到logger的日记请求(logging request)也都有一个level,如若该request的level大于即是该logger的level,则该request将被处置(称作enabled);要不然该request将被忽略。故可得悉: logger的level越低,示意该logger越详细;logging request的level越高,示意该logging request越优先输出

Level种中预约义了五个level,它们的大小关系如次:

Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF

示范代码
以次代码将用自各儿分属的种为参数,创办一个logger,起用默许配备,设立其level并向其输出若干logging request。

Java代码
import org.apache.log四j.Logger;
import org.apache.log四j.BasicConfigurator;
import org.apache.log四j.Level;

public class Log四jTest {
public static void main(String argv[]) {


// Create a logger by the name of class Log四jTest.

Logger logger = Logger.getLogger(Log四jTest.class);

// Use the default configuration.

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;
}
}

import org.apache.log四j.Logger;
import org.apache.log四j.BasicConfigurator;
import org.apache.log四j.Level;

public class Log四jTest {
public static void main(String argv[]) {


// Create a logger by the name of class Log四jTest.

Logger logger = Logger.getLogger(Log四jTest.class);

// Use the default configuration.

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;
}
}
至于logger的两点说明
用同名参数调用Logger.getLogger(String name)将回来同一个logger的摘引。故可以在一个地方配备logger,在除此而外一个地方取得配备好的logger,而无需相互间传送logger的摘引。 logger的创设可以依照随便的顺序,即,父logger可之后于子logger被创办。log四j将自动维护logger的承继树。

Appender:日记目的地
每个logger都可以拥有一个也许多个appender,每个appender示意一个日记的输出目的地,例如console可能某个资料。可以运用Logger.addAppender(Appender app)为logger增多一个appender;可以应用Logger.removeAppender(Appender app)为logger移除一个appender。默许情况下,logger的additive标示被设立为true,示意子logger将承袭父logger的全部appenders。该选项可以被从新设立,示意子logger将不再承袭父logger的appenders。root logger拥有目标为system.out的consoleAppender,故默许情况下,全部的logger都将承袭该appender。

Java代码
------ Log四j APIs : class Logger ------

// 为logger对象增多也许移除一个Appender对象 :.

public void appAppender(Appender app);
public void removeAppender(Appender app);

// 取得和设立additive标示:是不是沿袭父logger的appenders :.
// 注意:在设立additive标示为false时,务必责任书已经为该logger设立了新的appender, :.
// 不然log四j将报错:log四j:WARN No appenders could be found for logger (x.y.z). :.

public boolean getAdditivity();
public void setAdditivity(boolean additive);

------ Log四j APIs : class Logger ------

// 为logger对象增多或许移除一个Appender对象 :.

public void appAppender(Appender app);
public void removeAppender(Appender app);

// 取得和设立additive标示:是不是承袭父logger的appenders :.
// 注意:在设立additive标示为false时,务必军令状已经为该logger设立了新的appender, :.
// 要不然log四j将报错:log四j:WARN No appenders could be found for logger (x.y.z). :.

public boolean getAdditivity();
public void setAdditivity(boolean additive);
ConsoleAppender
可以应用ConsoleAppender对象把日记输出到控制台。每个ConsoleAppender都有一个target,示意它的输出目的地。它可以是System.out,基准输出设备(缓冲荧光屏);或者是System.err,基准错处装置(不缓冲荧光屏)。ConsoleAppender的使用方法参照如次API :.

Java代码
------ Log四j APIs : class ConsoleAppender extends WriterAppender ------

// 结构步骤,施用一个Layout对象结构一个ConsoleAppender对象 :.
// 默许情况下,ConsoleAppender的target是System.out :.

public ConsoleAppender(Layout layout);

// 结构步骤,运用一个Layout对象和一个target字符串结构ConsoleAppender对象 :.
// target的或许取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR :.

public ConsoleAppender(Layout layout, String target);

------ Log四j APIs : class ConsoleAppender extends WriterAppender ------

// 结构步骤,运用一个Layout对象结构一个ConsoleAppender对象 :.
// 默许情况下,ConsoleAppender的target是System.out :.

public ConsoleAppender(Layout layout);

// 结构步骤,运用一个Layout对象和一个target字符串结构ConsoleAppender对象 :.
// target的或者取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR :.

public ConsoleAppender(Layout layout, String target);
FileAppender
可以应用FileAppender对象把日记输出到一个指定的日记资料中去。使用方法可以参照如次的API :.

Java代码
------ Log四j APIs : class FileAppender extends WriterAppender ------

// 结构步骤,应用一个Layout对象和日记文件名结构一个FileAppender对象 :.

public FileAppender(Layout layout, String filename)
throws IOException;
public FileAppender(Layout layout, String filename, boolean append)
throws IOException;

------ Log四j APIs : class FileAppender extends WriterAppender ------

// 结构步骤,施用一个Layout对象和日记文件名结构一个FileAppender对象 :.

public FileAppender(Layout layout, String filename)
throws IOException;
public FileAppender(Layout layout, String filename, boolean append)
throws IOException;
RollingFileAppender
可以应用FileAppender的子类RollingFileAppender对象,把日记输出到一个指定的日记资料中。不同的是该日记资料的大小受到限制,当天志内容超出最大的尺码时,该资料将向上滚动(最老掉牙的日记被擦除)。还可以在此类对象三拇指定为日记资料做多少个备份。具体使用方法参照如次API :.

Java代码
------ Log四j APIs : class RollingFileAppender extends FileAppender ------

// 结构步骤,施用一个Layout对象和日记文件名结构一个RollingFileAppender对象 :.

public RollingFileAppender(Layout layout, String filename)
throws IOException;
public RollingFileAppender(Layout layout, String filename, boolean append)
throws IOException;

// 取得和设立日记备份文件的个数 :.

public int getMaxBackupIndex();
public void setMaxBackupIndex(int index);

// 取得和设立滚动日记资料的最大尺寸 :.

public long getMaximumFileSize();
public void setMaximumFileSize(long size);

------ Log四j APIs : class RollingFileAppender extends FileAppender ------

// 结构步骤,应用一个Layout对象和日记文件名结构一个RollingFileAppender对象 :.

public RollingFileAppender(Layout layout, String filename)
throws IOException;
public RollingFileAppender(Layout layout, String filename, boolean append)
throws IOException;

// 取得和设立日记备份文件的个数 :.

public int getMaxBackupIndex();
public void setMaxBackupIndex(int index);

// 取得和设立滚动日记资料的最大尺寸 :.

public long getMaximumFileSize();
public void setMaximumFileSize(long size);
Layout:日记格式化器
每个appender都和一个layout相联系;layout的任务是格式化用户的logging request,appender的任务是把layout格式化好的输出内容送往指定的目的地。

PatternLayout
PatternLayout是Layout的一个头类,用于施用相仿C语言的printf函数中应用的格式控制字符串来统制日记的输出格式。使用方法参照如次API :.

Java代码
------ Log四j APIs : class PatternLayout extends Layout ------

// 无参数结构步骤,施用DEFAULT_CONVERSION_PATTERN结构一个PatternLayout :.
// 注意:DEFAULT_CONVERSION_PATTERN为"%m%n",只打印讯息信息 :.

public PatternLayout();
// 结构步骤,运用自定义的pattern结构一个PatternLayout :.

public PatternLayout(String pattern);

// 取得和设立PatternLayout对象的日记pattern :.

public String getConversionPattern();
public void setConversionPattern(String pattern);

patterns in PatternLayout

------ Log四j APIs : class PatternLayout extends Layout ------

// 无参数结构步骤,应用DEFAULT_CONVERSION_PATTERN结构一个PatternLayout :.
// 注意:DEFAULT_CONVERSION_PATTERN为"%m%n",只打印讯息信息 :.

public PatternLayout();
// 结构步骤,施用自定义的pattern结构一个PatternLayout :.

public PatternLayout(String pattern);

// 取得和设立PatternLayout对象的日记pattern :.

public String getConversionPattern();
public void setConversionPattern(String pattern);

patterns in PatternLayout

Configuration:配备
对log四j环境的配备乃是对root logger的配备,包括把root logger设立为哪个级别(level);为它增多哪些appender,之类。这些可以透过设立系统属性的步骤来隐式地完成,也可以在程序里调用XXXConfigurator.configure()步骤来显式地完成。

默许的log四j初始化进程
Logger种的静态初始化块(static initialization block)中对log四j的环境做默许的初始化。注意:如若程序员已经经过设立系统属性的步骤来配备了log四j环境,则不需要再显式地调用XXXConfigurator.configure()步骤来配备log四j环境了。Logger的静态初始化块在完成初始化进程时将检察一连串log四j定义的系统属性。它所做的事儿如次:稽查系统属性log四j.defaultInitOverride,如其该属性被设立为false,则施行初始化;不然(只若非false,无论什么值,甚或没值,都是不是则),跳过初始化。 把系统属性log四j.configuration的值赋给变量resource。如其该系统变量没被定义,则把resource赋值为"log四j.properties"。注意:在apache的log四j文档中提议施用定义log四j.configuration系统属性的步骤来设立默许的初始化资料是一个好步骤。 意欲把resource变量转化变成一个URL对象url。如若正常的转化步骤行不通,就调用org.apache.log四j.helpers.Loader.getResource(resource, Logger.class)步骤来完成转化。
如其url以".html"扫尾,则调用步骤DOMConfigurator.configure(url)来完成初始化;不然,则调用步骤PropertyConfigurator.configure(url)来完成初始化。如其url指定的资源不能被取得,则冲出初始化进程。

BasicConfigurator.configure()
BasicConfigurator.configure()步骤应用最简的步骤配备log四j环境。注:所谓配备log四j环境,便是指配备root logger,由于全部其它的logger都是root logger的后人,之所以它们(默许情况下)都将承袭root logger的本质。

BasicConfigurator.configure()完成的任务是:

用默许pattern创造PatternLayout对象p:
PatternLayout p = new PatternLayout("%-四r[%t]%-五p%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);

xml格式的log四j配置文件概述
xml格式的log四j配置文件亟需施用org.apache.log四j.html.DOMConfigurator.configure()步骤来读入。对xml资料的语法定义可以在log四j的公布包中找出:org/apache/log四j/xml/log四j.dtd。

log四j的xml配置文件的树状构造
log四j的xml配置文件的树状构造如下所示,注意下图只展示了惯用的一部分。 :.

xml declaration and dtd
|
log四j:configuration
|
+-- appender (name, class)
| |
| +-- param (name, value)
| +-- layout (class)
| |
| +-- param (name, value)
+-- logger (name, additivity)
| |
| +-- level (class, value)
| | |
| | +-- param (name, value)
| +-- appender-ref (ref)
+-- root
|
+-- param (name, class)
+-- level
| |
| +-- param (name, value)
+-- appender-ref (ref)
xml declaration and dtd
xml配置文件的脑袋包括两个一部分:xml宣言和dtd宣言。脑袋的格式如次: :.




log四j:configuration (root element)

xmlns:log四j [#FIXED attribute] : 定义log四j的名字空间,取定值"http://jakarta.apache.org/log四j/"
appender [* child] : 一个appender子元素定义一个日记输出目的地
logger [* child] : 一个logger子元素定义一个日记写出器
root [? child] : root子元素定义了root logger

appender
appender元素定义一个日记输出目的地。

name [#REQUIRED attribute] : 定义appender的名字,以便被后文引述
class [#REQUIRED attribute] : 定义appender对象分属的种的全名
param [* child] : 创造appender对象时传送给类结构步骤的参数
layout [? child] : 该appender运用的layout对象

layout
layout元素定义与某一个appender相联系的日记格式化器。

class [#REQUIRED attribute] : 定义layout对象分属的种的全名
param [* child] : 创造layout对象时传送给类结构步骤的参数

logger
logger元素定义一个日记输出器。
name [#REQUIRED attribute] : 定义logger的名字,以便被后文摘引
additivity [#ENUM attribute] : 取值为"true"(默许)或许"false",是不是承袭父logger的属性
level [? child] : 定义该logger的日记级别
appender-ref [* child] : 定义该logger的输出目的地

root
root元素定义根日记输出器root logger。

param [* child] : 创造root logger对象时传送给类结构步骤的参数
level [? child] : 定义root logger的日记级别
appender-ref [* child] : 定义root logger的输出目的地

level
level元素定义logger对象的日记级别。

class [#IMPLIED attribute] : 定义level对象分属的种,默许情况下是"org.apache.log四j.Level种
value [#REQUIRED attribute] : 为level对象赋值。也许的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时示意没任哪一天志信息被输出
param [* child] : 创设level对象时传送给类结构步骤的参数

appender-ref
appender-ref元素引述一个appender元素的名字,为logger对象增多一个appender。

ref [#REQUIRED attribute] : 一个appender元素的名字的引述
appender-ref元素没子元素

param
param元素在创造对象时为种的结构步骤提供参数。它可以变成appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。

name and value [#REQUIRED attributes] : 提供参数的一组名值对
param元素没子元素

在xml资料中配备appender和layout
创设不同的Appender对象可能不同的Layout对象要调用不同的结构步骤。可以运用param子元从来设定不同的参数值。

创设ConsoleAppender对象 ConsoleAppender的结构步骤不接受其它的参数。 :.
Java代码
... ... ... ...


... ...


... ... ... ...

... ... ... ...


... ...


... ... ... ...
创设FileAppender对象
可认为FileAppender种的结构步骤传送两个参数:File示意日记文件名;Append示意如资料已存在,是不是把日记累加到资料尾部,或许取值为"true"和"false"(默许)。 :.
Java代码
... ... ... ..




... ...


... ... ... ...

... ... ... ..




... ...


... ... ... ...
创造RollingFileAppender对象
除开File和Append之外,还可认为RollingFileAppender种的结构步骤传接两个参数:MaxBackupIndex备份日记资料的个数(默许是1个);MaxFileSize示意日记资料容许的最大楷节数(默许是十M)。 :.
Java代码
... ... ... ...






... ...


... ... ... ...

... ... ... ...






... ...


... ... ... ...
Java代码
创办PatternLayout对象

创造PatternLayout对象
可认为PatternLayout种的结构步骤传接参数ConversionPattern。 :.
Java代码
... ... ... ...


... ... ... ...

... ... ... ...


... ... ... ...
我自各儿的一个施用xml资料配备log四j环境的很简单的例证
为WSOTA项目开发java web start的胖客户端时,运用了如次的xml资料配备log四j环境(文件名叫wsota-rc.log四j.html)::.
Java代码
























































































在胖客户程序中运用了如次代码来施用外部xml资料配备log四j环境,注意该代码段座落程序的main class的静态初始化块中,带有以次代码的种和xml配置文件在同一个索引下:
Java代码
import org.apache.log四j.html.DOMConfigurator;

public class SapFrame extends JFrame {
static {
DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log四j.html"));
}
... ... ... ...
}

import org.apache.log四j.html.DOMConfigurator;

public class SapFrame extends JFrame {
static {
DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log四j.html"));
}
... ... ... ...
}
Log四j的编码习气

让每个种都拥有一个private static的Logger对象,用以输出此类中的所有日记信息
运用xml资料来完成对log四j环境的配备。在项目的main class中的静态初始化块里放log四j环境的配备代码。注意:在一个项目中,log四j环境只需要被配备一次,而不是在每个应用了logger的类里都亟需调用一次
用MyClass.class作为参数创设此类的静态Logger对象
本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception

  • 3076 - j2me在加载图片时出现IO异常和空指针异常
  • 3077 - 图片处理报java.lang.OutOfMemoryError异常
  • 3078 - Context struts2_JPA_Demo startup failed due to previous errors
  • 3079 - 为什么程序中有退出的代码java还要抛出异常呢?
  • 3080 - ActionContext.getContext().getSession() 报空异常
  • 3081 - java.io.IOException:Credentials do not exist
  • 3082 - struts2抛自定义异常
  • 3083 - ERROR 1064(42000)
  • 3084 - java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
  • 3085 - 系统在运行时出现异常怎么处理
  • 原创粉丝点击