定义:
Log4j是高度可配置的,并可通过在运行时的外部文件配置。
它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地
诸如:数据库,文件,控制台,UNIX系统日志等。
组成:
Log4j中有三个主要组成部分:
loggers: 负责捕获记录信息。
appenders : 负责发布日志信息,以不同的首选目的地。
layouts: 负责格式化不同风格的日志信息。
log4j框架对象的类型:
核心框架:Logger对象,布局对象,Appender对象
支持框架:Level对象,Filter对象,对象渲染器,日志管理
框架各个对象的作用:
核心框架
Logger对象:顶级层的Logger,它提供Logger对象。
Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。
Layout对象:该层提供其用于格式化不同风格的日志信息的对象。
Layout层提供支持Appender对象到发布日志信息之前。
布局对象的发布方式是人类可读的及可重复使用的记录信息的一个重要的角色
Appender对象:下位层提供Appender对象。
Appender对象负责发布日志信息,以不同的首选目的地,如数据库,文件,控制台,UNIX系统日志等。
总结:Logger负责捕捉对象操作日志,Layout对象负责格式化,Appender负责发布日志信息,他们之间具有时序性
支持对象:
Level对象:级别对象定义的任何记录信息的粒度和优先级。
有记录的七个级别在API中定义:OFF, DEBUG, INFO, ERROR, WARN, FATAL 和 ALL
Filter对象:过滤对象用于分析日志信息及是否应记录或不用这些信息做出进一步的决定。
一个appender对象可以有与之关联的几个Filter对象。
如果日志记录信息传递给特定Appender对象,都和特定Appender相关的Filter对象批准的日志信息,
然后才能发布到所连接的目的地。
对象渲染器:ObjectRenderer对象是一个指定提供传递到日志框架的不同对象的字符串表示。
这个对象所使用的布局对象来准备最后的日志信息。
日志管理:日志管理对象管理的日志框架。
它负责从一个系统级的配置文件或配置类读取初始配置参数。
总结:
Level,给日志的记录赋予等级,
Filter对象,过滤不需要发布的日志信息,
对象渲染器
日志管理:负责读取log4j的配置参数文件
log4j的配置:
配置文件是properties文件,这是一个以键值对格式保存的文件类型.默认情况,日志管理在CLASSPATH查找一个名为log4j.properties的文件
Appenders:
功能:Appender对象主要负责打印日志消息到不同的目的地,如控制台,文件,sockets,NT事件日志等等。
属性:每个Appender对象具有与之相关联的不同的属性,并且这些属性表明对象的行为
属性
描述
layout
Appender使用布局Layout 对象和与之相关的格式化的日志记录信息转换模式
target
目标可以是一个控制台,一个文件,或根据附加器的另一个项目
level
级别是必需的,以控制日志消息的过滤
threshold
Appender可以有与之独立的记录器级别相关联的级别阈值水平。Appender忽略具有级别低于阈级别的任何日志消息
filter
Filter 对象可以分析超出级别的匹配记录信息,并决定是否记录的请求应该由一个特定 Appender 或忽略处理
可以通过包括以下方法的配置文件中的下面设置一个 Appender 对象添加到记录器:
log4j.logger.[logger-name]=level, appender1,appender..n
Layout:
作用:对日志信息进行格式化
种类:
DateLayout
HTMLLayout
PatternLayout
SimpleLayout
XMLLayout
具体使用:(HTMLLayout)
HTMLLayout是一个非常简单的布局对象,它提供以下方法:
S.N.
方法 & 描述
1
setContentType(String)
设置 text/html 为 HTML内容的内容类型。默认为 text/html
2
setLocationInfo(String)
设置位置信息记录事件。默认为 false
3
setTitle(String)
设置为HTML文件的标题。默认值是Log4j的日志信息
HTMLLayout 例子:
以下是对HTMLLayout一个简单的配置文件:
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/htmlLayout.html
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout
log4j.appender.FILE.layout.Title=HTML Layout Example
log4j.appender.FILE.layout.LocationInfo=true
现在考虑下面的Java例子用于产生日志信息:
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class log4jExample{
/* Get actual class name to be printed on */
static Logger log = Logger.getLogger(
log4jExample.class.getName());
public static void main(String[] args)
throws IOException,SQLException{
log.debug("Hello this is an debug message");
log.info("Hello this is an info message");
}
}
编译并运行上述程序,它会在 /usr/home/log4j 目录创建 htmlLayout.html 文件,该文件将有如下的日志信息:
Log session start time Mon Mar 22 13:30:24 AST 2014
Time
Thread
Level
Category
File:Line
Message
0
main
DEBUG
log4jExample
log4jExample.java:15
Hello this is an debug message
6
main
INFO
log4jExample
log4jExample.java:16
Hello this is an info message
可以使用一个Web浏览器打开htmlLayout.html 文件。同样重要的是要注意,页脚 HTML>和 body>标记是完全缺失。
一个具有HTML格式的日志文件的一大优势是,它可以被发布为网页可以远程查看。
(PatternLayout)
生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息。
PatternLayout类扩展抽象 org.apache.log4j.Layout 类并覆盖format()方法根据提供的模式构建日志信息。
PatternLayout也是一个简单的布局对象,它提供下列Bean属性,可以通过配置文件进行设置:
S.N.
属性和说明
1
conversionPattern
设置转换模式。默认为 %r [%t] %p %c %x - %m%n
模式转换字符:
下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:
转换字符
表示的意思
c
用于输出的记录事件的类别。例如,对于类别名称"a.b.c" 模式 %c{2} 会输出 "b.c"
C
用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass".
d
用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}.
F
用于输出被发出日志记录请求,其中的文件名
l
用于将产生的日志事件调用者输出位置信息
L
用于输出从被发出日志记录请求的行号
m
用于输出使用日志事件相关联的应用程序提供的消息
M
用于输出发出日志请求所在的方法名称
n
输出平台相关的行分隔符或文字
p
用于输出的记录事件的优先级
r
用于输出毫秒从布局的结构经过直到创建日志记录事件的数目
t
用于输出生成的日志记录事件的线程的名称
x
用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文)
X
在X转换字符后面是键为的MDC。例如 X{clientIP} 将打印存储在MDC对键clientIP的信息
%
文字百分号 %%将打印%标志
格式修饰符:
默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。
下表涵盖了各种各样的修饰符的情况:
Format
left
minimum
maximum
注释
modifier
justify
width
width
%20c
false
20
none
用空格左垫,如果类别名称少于20个字符长
%-20c
true
20
none
用空格右垫,如果类别名称少于20个字符长
%.30c
NA
none
30
从开始截断,如果类别名称超过30个字符长
%20.30c
false
20
30
用空格左侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。
%-20.30c
true
20
30
用空格右侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。
PatternLayout 示例:
以下是针对 PatternLayout 一个简单的配置文件:
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=
%d{yyyy-MM-dd}-%t-%x-%-5p-%-10c:%m%n
现在考虑下面产生日志信息的Java例子:
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class log4jExample{
/* Get actual class name to be printed on */
static Logger log = Logger.getLogger(
log4jExample.class.getName());
public static void main(String[] args)
throws IOException,SQLException{
log.debug("Hello this is an debug message");
log.info("Hello this is an info message");
}
}
编译并运行上述程序,它会创建 log.out文件在 /usr/home/log4j 目录,该文件将有如下的日志信息:
2010-03-23-main--DEBUG-log4jExample:Hello this is an debug message
2010-03-23-main--INFO -log4jExample:Hello this is an info message
Logger:
作用:Logger类提供了多种方法来处理日志活动.
实例化: Logger类不允许实例化一个新的记录器实例,但它提供了两个静态方法获得一个 Logger 对象:
public static Logger getRootLogger();
public static Logger getLogger(String name);
ps.第一种方法返回的log对象是没用名字的
第二种是返回的对象是有名字的 static Logger log = Logger.getLogger(log4jExample.class.getName());
方法: 得到了一个名为记录器的实例之后,可以使用记录的几种方法来记录消息.
Logger类有专门用于打印日志信息下面的方法如下
方法及描述
1
public void debug(Object message)
这种方法打印使用 Level.DEBUG 消息级别
2
public void error(Object message)
这种方法打印使用 Level.ERROR 消息级别
3
public void fatal(Object message);
这种方法打印使用 Level.FATAL 消息级别
4
public void info(Object message);
这种方法打印使用 Level.INFO 消息级别
5
public void warn(Object message);
这种方法打印使用 Level.WARN 消息级别
6
public void trace(Object message);
这种方法打印使用Level.TRACE消息级别
例:
import org.apache.log4j.Logger;
public class LogClass {
private static org.apache.log4j.Logger log = Logger
.getLogger(LogClass.class);
public static void main(String[] args) {
log.trace("Trace Message!");
log.debug("Debug Message!");
log.info("Info Message!");
log.warn("Warn Message!");
log.error("Error Message!");
log.fatal("Fatal Message!");
}
}
运行结果:
Debug Message!
Info Message!
Warn Message!
Error Message!
Fatal Message!
日志级别(level):
Level
描述
ALL
各级包括自定义级别
DEBUG
指定细粒度信息事件是最有用的应用程序调试
ERROR
错误事件可能仍然允许应用程序继续运行
FATAL
指定非常严重的错误事件,这可能导致应用程序中止
INFO
指定能够突出在粗粒度级别的应用程序运行情况的信息的消息
OFF
这是最高等级,为了关闭日志记录
TRACE
指定细粒度比DEBUG更低的信息事件
WARN
指定具有潜在危害的情况
级别p的级别使用q,在记录日志请求时,如果p>=q启用。
这条规则是log4j的核心。它假设级别是有序的。
对于标准级别它们关系如下:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
例:
import org.apache.log4j.*;
public class LogClass {
private static org.apache.log4j.Logger log = Logger
.getLogger(LogClass.class);
public static void main(String[] args) {
log.setLevel(Level.WARN);
//设置等级
log.trace("Trace Message!");
log.debug("Debug Message!");
log.info("Info Message!");
log.warn("Warn Message!");
log.error("Error Message!");
log.fatal("Fatal Message!");
}
}
运行结果:
Warn Message!
Error Message!
Fatal Message!