Log4j实用手册
===================================================================================================
简介
1.Log4J是Apache的一个开源项目,是用来操作程序日志信息的框架。
______________________________________________________________________________________
2.Log4J的功能通过配置log4j.properties属性文件实现。
______________________________________________________________________________________
3.log4j.properties文件中配置日志信息的记录器,并为记录器配置日志级别、输出地点、输出格式。

·首先定义记录器,管理不同的日志信息(可以配置一个或多个记录器);
·每一个记录器对应一个或多个存放器,用来设置日志信息的存放地点;
·每一个存放器对应一个布局格式,用来设置日志信息输出时的布局格式。

记录器用来整合日志信息,一个日志信息整合好之后,交给记录器的所有存放器,每一个存放器根据自己的格式进行输出记录改条日志信息。

所以:
存放器是属于记录器的,格式布局是属于存放器的。
记录器可配置多个存放器,存放器只能有一个输出方式。
______________________________________________________________________________________
4.输出地点

·控制台 - Console
·文件 - File
·GUI component - GUI组件
·Remote socket server - 套接口服务器
·NT Event Logger - NT的事件记录器
·Remote UNIX Syslog daemon - UNIX Syslog守护进程
______________________________________________________________________________________
5.输出格式

·HTML格式
·灵活格式
·包含日志信息的级别和信息字符串
·包含日志产生的时间、线程和类别等信息
______________________________________________________________________________________
6.程序中通过获得记录器,调用记录器的方法来产生日志信息。
记录器 – Logger

记录器:决定什么日志信息应该被输出、什么日志信息应该被忽略。
______________________________________________________________________________________
1.根记录器 : rootLogger

配置语法
- 日志级别 :all、debug、info、warn、error、fatal、off、自定义级别 [低-高]
- 分级原因 :
______________________________________________________________________________________
2.自定义记录器

配置语法
______________________________________________________________________________________
3.记录器的继承性

如果一个记录器后面又用"."跟出了另一个记录器,则点后面的记录器是点前面的记录器的子记录器。
log4j.logger.记录器1 = 日志级别,存放器1
log4j.logger.记录器1.记录器2 = 日志级别,存放器1

继承关系研究
- 日志级别继承 :子记录器黙认继承父记录器的日志级别
但如果子记录器新定义了日志级别,则不继承而是使用自己新定义的日志级别;
- 存放地点继承 :子记录器黙认继承父记录器的所有存放器
但如果把子记录器的additivity标志设为false,那么它就不会继承父记录器的存放器。

根记录器是所有其它记录器的基记录器
- 永远存在
- 不能通过名字检索或引用
- 通过Logger.getRootLogger()方法取得它。
______________________________________________________________________________________
4. Logger类 【程序中记录器由org.apache.log4j.Logger类实现操作】

Logger类方法列表:
//获得记录器的方法
public static Logger getRootLogger();
public static Logger getLogger(String 自定义记录器名称);
//固定级别记录
public void debug(Object 日志消息);
public void info (Object 日志消息);
public void warn (Object 日志消息);
public void error(Object 日志消息);
public void fatal(Object 日志消息);
//参数级别记录
public void log(Priority 日志级别, Object日志消息);

程序中首先获得记录器[根记录器或者自定义记录器],而后调用记录器的方法进行日志信息的记录。
- 调用固定级别记录方法时,只有当该方法的级别>=记录器配置级别时, 该方法才会被执行。
- 调用log()方法时,只有当参数级别>=WARN时,它才会被执行。


存放器 - Appender

存放器:存放日志信息 / 指定日志信息输出地。
____________________________________________________________________________
配置语法

log4j.appender.存放器名 = 存放类
log4j.appender.存放器名.option1 = value1
… …
log4j.appender.存放器名.optionN = valueN

____________________________________________________________________________
存放类

org.apache.log4j.ConsoleAppender - 控制台输出

org.apache.log4j.FileAppender - 文件
org.apache.log4j.DailyRollingFileAppender - 每天产生一个日志文件
org.apache.log4j.RollingFileAppender - 文件大小到达指定尺寸的时候产生一个新的文件

org.apache.log4j.WriterAppender - 将日志信息以流格式发送到任意指定的地方

备注:
如果一个存放器使用的是文件相关的存放类,则必须为该存放器再配置一个输出文件

log4j.appender.某存放器 = org.apache.log4j.FileAppender
log4j.appender.某存放器.File = log.txt

格式化 - Layout

存放器:指定日志信息的输出格式。
____________________________________________________________________________
配置语法

log4j.appender.存放器名.layout = 格式类
log4j.appender.存放器名.layout.option1 = value1
… …
log4j.appender.存放器名.layout.optionN = valueN

____________________________________________________________________________
格式类

org.apache.log4j.HTMLLayout - HTML表格形式布局
org.apache.log4j.PatternLayout - 灵活地指定布局模式
org.apache.log4j.SimpleLayout - 包含日志信息的级别和信息字符串
org.apache.log4j.TTCCLayout - 包含日志产生的时间、线程和类别等信息

备注:
如果是PatternLayout方式,则需要使用ConversionPattern预定义输出格式。

log4j.appender.存放器名.layout = org.apache.log4j.PatternLayout
log4j.appender.存放器名.layout.ConversionPattern = 预定义格式

预定义格式符号:
%r - 自程序开始后消耗的毫秒数
%t - 表示日志记录请求生成的线程
%p - 日志级别
%r - 与日志请求相关的类别名称
%c - 记录器所在类的全类名
%m%n - 日志信息
%d - 日志时间 {yyyy-MM-dd HH:ss:mm}

[经测试:%m%n放在其他信息前面会导致其他信息换行输出]


log4j.properties

#根记录器

log4j.rootLogger = 级别,存放器00

log4j.appender.存放器00 = 存放类
log4j.appender.存放器00.layout = 格式类00


#记录器01

log4j.logger.记录器01 = 级别,存放器01,存放器11

log4j.appender.存放器01 = 存放类
log4j.appender.存放器01.layout = 格式类

log4j.appender.存放器11 = 存放类
log4j.appender.存放器11.layout = 格式类


#记录器02

log4j.logger.记录器02 = 级别,存放器02

log4j.appender.存放器02 = 存放类
log4j.appender.存放器02.layout = 格式类

开发实例

import org.apache.log4j.Logger

public class ClassName
{
public void static main(String [] args)
{
Logger theLogger = new Logger();

theLogger.warn(“ddddddd”);
}
}


实际经验

1.获取不到记录器

代码中,如果获取一个记录器时,该记录器不存在,则会使用根记录器。

Logger logger = Logger.getLogger(“配置文件中不存在的记录器名”);

此时,获取到的记录器实际上是根记录器。