Q
Published on
· Last modified on
· Public

log4j

1. log4j 简介
几乎每个大的应用程序都有它自己的日志和跟踪程序的API 。顺应这一规则,E.U. SEMPER 项目组决定编写它自己的程序跟踪API (tracing API )。这开始于1996 年早期。经过无数的工作,更改和性能加强,这个API 终于成为一个十分受欢迎的Java 日志软件包,那就是log4j 。这个软件包的发行遵守open source 动议认证的Apache Software License 。最新的log4j 版本包括全部的源代码,类文件和文档资料,可以在http://logging.apache.org/log4j/ 找到它们。另外,log4j 已经被转换成 C, C++, C#, Perl, Python, Ruby, 和 Eiffel 语言。
Log4j 是Apache 的一个开放源代码项目,通过使用Log4j ,我们可以控制日志信息输送的目的地是控制台、文件、GUI 组件、甚至是套接口服务 器、NT 的事件记录器、UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
在应用程序中输出日志有三个目的:
(1 )监视代码中变量的变化情况,把数据周期性地记录到文件中供其他应用进行统计分析工作。
(2 )跟踪代码运行轨迹,作为日后审计的依据。
(3 )担当集成开发环境中的调试器,向文件或控制台打印代码的调试信息。
  Apache 能用日志包(Commons Logging Package )是Apache 的一个开放源代码项目,它提供了一组通用的日志接口,用户可以自由地选择实现日志接口的第三方软件。通用日志包目前支持以下日志实现:
Log4J 日志器( http://jakarta.apache.org/log4j
JDK1.4 Logging 日志器 (JDK1.4 自带 )
SimpleLog 日志器 ( 把日志消息输出到标准系统错误流 System.err)
NoOpLog( 不输出任何日志信息 )
1.1 日志中两个常用的接口:LogFactory
和Log
1.1.1 Log 接口
通用日志包把消息分为6 个级别:FATAL 、ERROR 、WARN 、INFO 、DEBUG 和TRACE 。其中FATAL 级别最高,TRACE 级别最低。Log 接口提供输出不同级别消息的方法:
off--------------------------------- 最高等级的,用于关闭所有日志记录
fatal(Object message)------- 输出FATAL 级别的消息。
error(Object message)------- 输出ERROR 级别的消息。
warn(Object message)------- 输出WARN 级别的消息。
info(Object message)------- 输出INFO 级别的消息。
debug(Object message)------- 输出DEBUG 级别的消息。
trace(Object message)------- 输出TRACE 级别的消息。
all---------------------------------- 最低等级的,用于打开所有日志记录
注:Loggers 组件在此系统中被分为五个级别:DEBUG 、INFO 、WARN 、ERROR 和FATAL 。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR
< FATAL ,分别用来指定这条日志信息的重要程度, 明白这一点很重要,这里Log4j 有一个规则:假设Loggers 级别为P ,如果在Loggers 中发生了一个级别Q 比P 高,则可以启动,否则屏蔽掉。假设你定义的级别是info ,那么error 和warn 的日志可以显示而比他低的debug 信息就不显示了
1.1.2 LogFactory 接口
LogFactory 接口提供了获得日志器实例的两个静态方法:
public static Log getLog(String name) throws LogConfigurationException;
public static Log getLog(Class class) throws LogConfigurationException;
注:name 参数作为日志器的名字;class
参数指定类名作为日志器名字。
2. log4j 基本编程方法
以上是从原理方面说明Log4j 的使用方法,在具体Java 编程使用Log4j 可以参照以下示例:
2.1 建立Logger 实例
语法表示:public static Logger getLogger( String
name)
  实际使用:static
Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ())
2.2读取配置文件
获得了Logger 的实例之后,接下来将配置Log4j 使用环境:
  语法表示:
  BasicConfigurator.configure()
:自动快速地使用缺省Log4j 环境。
  PropertyConfigurator.configure(String
configFilename) :读取使用Java 的特性文件编写的配置文件。
  DOMConfigurator.configure(String
filename) :读取XML 形式的配置文件。
  实际使用:
PropertyConfigurator.configure("log4j.properties");
若log4j.properties 放在工程的根目录,可以不写上面的程序语句,程序会自动找到配置文件。
2.3插入日志信息
完成了以上两个步骤以后,下面就可以按日志的不同级别插入到你要记录日志的任何地方了。
  语法表示:
  Logger.debug(Object
message);// 调试信息
  Logger.info(Object
message);// 一般信息
  Logger.warn(Object
message);// 警告信息
  Logger.error(Object
message);// 错误信息
  Logger.fatal(Object
message);// 致命错误信息
实际使用:logger.info("ServerSocket before
accept: " + server);
3. log4j 配置文件
在实际编程时,要使Log4j 真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger 、Appender 及Layout 的分别使用。
Log4j 支持两种配置文件格式,一种是XML 格式的文件,一种是java properties (key=value )【Java 特性文件(键= 值)】。
3.1 使用properties文件配置文件
3.1.1 配置根Logger
其语法为:
log4j.rootLogger = [ level ] , appenderName1,
appenderName2, …
level : 是日志记录的优先级,分为OFF 、FATAL 、ERROR 、WARN 、INFO 、DEBUG 、ALL 或者您定义的级别。Log4j 建议只使用四个级别,优先级从高到低分别是ERROR 、WARN 、INFO 、DEBUG 。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO 级别,则应用程序中所有DEBUG 级别的日志信息将不被打印出来。
appenderName: 就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
例如:log4j.rootLogger =info,A1,B2,C3
3.1.2 配置日志信息输出目的地
其语法为:
log4j.appender.appenderName =
fully.qualified.name.of.appender.class
"fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个:
1.org.apache.log4j.ConsoleAppender
(控制台)
2.org.apache.log4j.FileAppender (文件)
3.org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
4.org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
3.1.2.1 ConsoleAppender 选项
Threshold=WARN: 指定日志消息的输出最低层次。
ImmediateFlush=true: 默认值是true, 意味着所有的消息都会被立即输出。
Target=System.err
:默认情况下是:System.out,
指定输出控制台
3.1.2.2 FileAppender 选项
Threshold=WARN:
指定日志消息的输出最低层次。
ImmediateFlush=true:
默认值是true, 意谓着所有的消息都会被立即输出。
File=mylog.txt:
指定消息输出到mylog.txt 文件。
Append=false: 默认值是true, 即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
3.1.2.3 DailyRollingFileAppender 选项
Threshold=WARN:
指定日志消息的输出最低层次。
ImmediateFlush=true:
默认值是true, 意谓着所有的消息都会被立即输出。
File=mylog.txt:
指定消息输出到mylog.txt 文件。
Append=false:
默认值是true, 即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
DatePattern='.'yyyy-ww: 每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:(单引号中的点.在文件名中就代表一个点.)
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小时
6)'.'yyyy-MM-dd-HH-mm: 每分钟
3.1.2.4 RollingFileAppender 选项
Threshold=WARN:
指定日志消息的输出最低层次。
ImmediateFlush=true:
默认值是true, 意谓着所有的消息都会被立即输出。
File=mylog.txt:
指定消息输出到mylog.txt 文件。
Append=false:
默认值是true, 即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1 文件。
MaxBackupIndex=2: 指定可以产生的滚动文件的最大数。
实际应用:
log4j.appender.A1=org.apache.log4j.ConsoleAppender
// 这里指定了日志输出的第一个位置A1 是控制台ConsoleAppender
3.1.3 配置日志信息的格式
(即布局方式)
其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
"fully.qualified.name.of.layout.class"
可以指定下面4 个格式中的一个:
1.org.apache.log4j.HTMLLayout (以HTML 表格形式布局)
2.org.apache.log4j.PatternLayout (可以灵活地指定布局模式)
3.org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串)
4.org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
1.HTMLLayout 选项
LocationInfo=true: 默认值是false, 输出java 文件名称和行号
Title=my app
file: 默认值是 Log4J Log Messages.
2.PatternLayout 选项
ConversionPattern=%m%n : 指定格式化指定消息的方式。
3.XMLLayout 选项
LocationInfo=true:
默认值是false, 输出java 文件和行号
实际应用:
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender. appenderName.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
这里需要说明的就是日志信息格式中几个符号所代表的含义:
-X : X 信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG ,INFO ,WARN ,ERROR ,FATAL,
%m: 输出代码中指定的消息, 产生的日志具体信息
%d: 输出日志时间点的日期或时间,默认格式为ISO8601 ,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS} ,输出类似:2002 年10 月18 日 22 :10 :28 ,921
%c: 输出日志信息所属的类目,通常就是所在类的全名(包含包名)
%F: 输出日志消息产生时所在的文件名称(即类名)
%t: 输出产生该日志事件的线程名(即方法名)
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L) 的组合, 包括类目名、发生的线程,以及在代码中的行数。(包含包、类、方法、行号)举例:Testlog4.main(TestLog4.java:10)
%L: 输出代码中的行号(只有行号)
%n: 输出一个回车换行符,Windows 平台为"/r/n" ,Unix 平台为"/n" 输出日志信息换行
%r:
输出自应用启动到输出该log 信息耗费的毫秒数
%x:
输出和当前线程相关联的NDC( 嵌套诊断环境), 尤其用到像java servlets 这样的多客户多线程的应用中。
%%: 输出一个"%" 字符
可以在% 与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c :指定输出category 的名称,最小的宽度是20 ,如果category 的名称小于20 的话,默认的情况下右对齐。
2)%-20c: 指定输出category 的名称,最小的宽度是20 ,如果category 的名称小于20 的话,"-" 号指定左对齐。
3)%.30c: 指定输出category 的名称,最大的宽度是30 ,如果category 的名称大于30 的话,就会将左边多出的字符截掉,但小于30 的话也不会有空格。
4)%20.30c: 如果category 的名称小于20 就补空格,并且右对齐,如果其名称长于30 字符,就从左边交远销出的字符截掉。
3.1.4 Log4j日志对应用性能的影响
如果在程序运行中输出大量日志,显然会对应用的性能造成一定的影响。Log4J 对性能的影响取决于以下因素:
日志输出目的地:输出到控制台的速度和输出到文件系统的速度是不一样的。
日志输出格式:格式简单,速度也更快。
日志级别:日志级别设置的越低,输出的日志内容越多,对性能的影响也越大。
3.1.5 举例说明
上面三个步骤是对前面Log4j 组件进行了简要的说明, 下面给出得 Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE,DIFINE
log4j.addivity.org.apache=true
###################
# Console Appender(控制台)
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
#####################
# File Appender(文件)
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=true
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# Rolling File(回滚文件)
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# SMTP Appender(发送日志邮件)
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender(输出到数据库日志表)
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO
LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
###################
#自定义 Appender
###################
log4j.appender.DIFINE =
net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.DIFINE.host =
mail.cybercorlin.net
log4j.appender.DIFINE.username = username
log4j.appender.DIFINE.password = password
log4j.appender.DIFINE.recipient =
corlin@cybercorlin.net
log4j.appender.DIFINE.layout=org.apache.log4j.PatternLayout
log4j.appender.DIFINE.layout.ConversionPattern
=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
3.2 使用XML 配置文件
3.2.1 控制台输出的xml文件配置解说及Java调用
首先,看看下面的XML 配置文件示例:
version="1.0" encoding="UTF-8" ?>
log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration<br>xmlns:log4j="http://jakarta.apache.org/log4j/ ">
<appender<br>name="ConsoleAppender"
class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.SimpleLayout">
<root>
<priority value<br="">="debug" />
<appender-ref<br>ref="ConsoleAppender"/>
</appender-ref<br></priority></root>
文件以标准的XML 声明作为开始,后面跟着指出DTD(文档类型定义)的DOCTYPE
声明,它定义了XML 文件的结构,例如,什么元素可以嵌入在其他元素中等等。上面文件在log4j 发行版的src/java/org/apache/log4j/xml 目录中。
接着看看封装所有元素的
log4j:configuration 元素,它在DOCTYPE 声明中被指定为根元素。嵌入在根元素中有两个结构:
<appender<br>name="ConsoleAppender"
class="org.apache.log4j.ConsoleAppender">
<layout<br>class="org.apache.log4j.SimpleLayout"/>
这里创建一个名叫"ConsoleAppender"
的Appender,注意:你可以选择任何名字,该示例之所以选择"ConsoleAppender" ,完全是为了示例的设计。接着这个appender
类以全名形式给出,经常用规范(fully qualified )类名。 Appender 必须具有一个指定的 name 和class 。嵌入在 Appender 之内的是 layout 元素,这里它被指定为SimpleLayout 。 Layout 必须具有一个 class 属性。
<root>
<priority<br>value ="debug" />
<appender-ref<br>ref="ConsoleAppender"/>
</appender-ref<br></priority<br></root>
root 元素必须存在且不能被子类化。示例中的优先级被设置为"debug" ,设置appender 饱含一个appender-ref 元素。还有更多的属性或元素可以指定。查看log4j 发行版中的src/java/org/apache/log4j/xml/log4j.dtd 以了解关于XML 配置文件结构的更多信息。
可以用下面这种方法把配置信息文件读入到Java
程序中:
DOMConfigurator.configure("configurationfile.xml"); // DOMConfigurator
用一棵DOM 树来初始化log4j 环境。这里是示例中的XML 配置文件:configurationfile.xml 。
这里是执行该配置文件的java 程序:
import org.apache.log4j.Logger;
import
org.apache.log4j.xml.DOMConfigurator;
public class externalxmltest {
static
Logger logger = Logger.getLogger(filetest.class);
public
static void main(String args[]) {
DOMConfigurator.configure("xmllog4jconfig.xml");
logger.debug("Here
is some DEBUG");
logger.info("Here
is some INFO");
logger.warn("Here
is some WARN");
logger.error("Here
is some ERROR");
logger.fatal("Here
is some FATAL");
}
}
3.2.2 文件形式日志输出
对于带有PatternLayout 的FileAppender 的日志记录器Logger 的XML 配置文件:
<log4j:configuration<br>xmlns:log4j="http://jakarta.apache.org/log4j/ ">
<appender<br>name="appender" class="org.apache.log4j.FileAppender">
<param<br>name="File" value="Indentify-Log.txt"/>
<param<br>name="Append" value="true"/>
<layout<br>class="org.apache.log4j.PatternLayout">
<param<br>name="ConversionPattern" value="%d [%t] %p - %m%n"/>
</param<br></layout<br></param<br></param<br></appender<br></log4j:configuration<br></layout<br></appender<br></layout>
<root>
<priority<br>value ="info"/>
<appender-ref<br>ref="appender"/>
</appender-ref<br></priority<br></root>
</appender<br></log4j:configuration<br>

N
Published on

求星星互粉

N
Published on
I
Published on

已星,求星

P
Published on

求星 已星

Sign in or Sign up Leave Comment