录着\。再次运行程序,查看文件,则\有两行。 另外,FileAppender 还有一个构造:
FileAppender(Layout layout, String filename, boolean append)
与示例的类似,只是多了一个boolean型的参数append。append参数是个开关,用来设置当程序重启,而目标文件已存在时,是向目标文件追加信息还是覆盖原来的信息,当值为true时就追加,这是FileAppender默认的,当值为false时则覆盖。此外,FileAppender还提供了setAppend方法来设置append开关。
4.org.apache.log4j.RollingFileAppender,继承了FileAppender,也是向文件输出信息,但文件大小可以限制。当文件大小超过限制时,该文件会被转为备份文件或删除,然后重新生成。文件的转换或删除与设置的备份文件最大数量有关,当数量大于0时就转为备份文件,否则(小于等于0)删除,默认的备份文件数量是1。转换备份文件非常简单,就是修改文件名,在原文件名之后加上\,例如文件test.txt,转为备份文件后文件名为\。但若同名的备份文件已存在,则会先将该备份文件删除或更名,这也与设置的备份文件最大数量有关,若达到最大数量就删除,否则更名。若备份文件更名时也遇到同样情况,则使用同样的处理方法,依此类推,直到达到设置的备份文件最大数量。备份文件更名也很简单,就是将扩展名加1,例如test.txt.1文件更名后变为test.txt.2,test.txt.2文件更名后变为test.txt.3。 示例代码:
SimpleLayout layout = new SimpleLayout();
//若文件不存在则创建文件,若文件已存在则向文件中追加内容 RollingFileAppender appender = null; try {
appender = new RollingFileAppender(layout, \ } catch(Exception e) {}
//限制备份文件的数量,本例为2个 appender.setMaxBackupIndex(2);
//限制目标文件的大小,单位字节,本例为10字节 appender.setMaximumFileSize(10);
Logger log = Logger.getLogger(Test.class); log.addAppender(appender);
log.debug(\ log.debug(\ log.debug(\
程序运行后,会在工程目录下生成test.txt、test.txt.1和test.txt.2三个文件,其中test.txt内容为空,而后两个文件则分别记录着\和\,这是怎么回事?原来由于目标文件大小被限制为10字节,而三次使用log.debug方法输出的信息都超过了10字节,这样就导致了三次备份文件转换,所以test.txt内容为空。而备份文件最大数量被设为2,因此第一次转换的备份文件就被删掉了,而后两次的则保存下来。此外,由于 test.txt转换备份文件时是先转为test.txt.1,再转为test.txt.2,因此最后test.txt.2的内
容是\,而test.txt.1是\,这点千万别弄混了。 另外,RollingFileAppender还提供了两个方法:
(1)setMaxFileSize,功能与 setMaximumFileSize一样,但参数是字符串,有两种情况:一是仅由数字组成,默认单位为字节,例如\,即表示限制文件大小为 100字节;一是由数字及存储单位组成,例如\、\、\,其中单位不区分大小写,分别表示限制文件大小为1K、1M、1G。
(2)rollOver,手动将目标文件转换为备份文件,使用起来较灵活,适用于复杂情况。 示例代码:
SimpleLayout layout = new SimpleLayout();
RollingFileAppender appender = null; try {
appender = new RollingFileAppender(layout, \ } catch(Exception e) {}
appender.setMaxBackupIndex(2);
Logger log = Logger.getLogger(Test.class); log.addAppender(appender);
log.debug(\ appender.rollOver(); log.debug(\ appender.rollOver(); log.debug(\ appender.rollOver();
这里没限制目标文件大小,但程序运行后,效果与上例相同。
5.org.apache.log4j.DailyRollingFileAppender,也继承了 FileAppender,并且也是向文件输出信息,但会根据设定的时间频率生成备份文件。 时间频率格式简介:
'.'yyyy- MM,按月生成,生成时间为每月最后一天午夜过后,例如test.txt在2005年7月31日午夜过后会被更名为test.txt.2005-07,然后重新生成。
'.'yyyy-ww,按周生成,生成时间为每周六午夜过后,例如test.txt在2005年8月13日午夜过后会被更名为 test.txt.2005-33,33表示当年第33周。
'.'yyyy-MM-dd,按天生成,生成时间为每天午夜过后,例如2005年 8月16日午夜过后,test.txt会被更名为test.txt.2005-08-16。
'.'yyyy-MM-dd-a,也是按天生成,但每天会生成两次,中午12:00过后一次,午夜过后一次,例如test.txt在2005年8月16日12:00过后会被更名为 test.txt.2005-8-16-上午,午夜过后会被更名为test.txt.2005-8-16-下午。 '.'yyyy-MM- dd-HH,按小时生成,例如test.txt在2005年8月16日12:00过后会被更名为test.txt.2005-8-16-11。
'.'yyyy-MM-dd-HH-mm,按分钟生成,例如test.txt在2005年8月16日12:00过后会被更名为 test.txt.2005-8-16-11-59。 示例代码:
SimpleLayout layout = new SimpleLayout();
DailyRollingFileAppender appender = null; try {
appender = new DailyRollingFileAppender(layout, \\
} catch(Exception e) {}
Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\
编码完成后运行程序,等一分钟后再次运行,由于我是在2005年8月17日15:42分第一次运行程序的,因此工程目录下最终有两个文件test.txt和 test.txt.2005-08-17-15-42。 6.org.apache.log4j.AsyncAppender,用于管理不同类型的Appender,也能实现同时向多个源输出信息,但其执行是异步的。 示例代码:
SimpleLayout layout = new SimpleLayout();
//向控制台输出
ConsoleAppender appender1 = null; try {
appender1 = new ConsoleAppender(layout); } catch(Exception e) {}
//向文件输出
FileAppender appender2 = null; try {
appender2 = new FileAppender(layout, \ } catch(Exception e) {}
//使用AsyncAppender实现同时向多个目标输出信息 AsyncAppender appender = new AsyncAppender(); appender.addAppender(appender1); appender.addAppender(appender2);
Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\ 此外,AsyncAppender和Logger都提供了更多的方法来管理Appender,例如getAppender、 getAllAppenders、removeAppender和removeAllAppenders,分别用来获取指定的Appender、获取全部 Appender、移除指定的Appender以及移除全部Appender。 7.org.apache.log4j.jdbc.JDBCAppender,将信息输出到数据库。 示例代码:
JDBCAppender appender = new JDBCAppender(); appender.setDriver(\
appender.setURL(\ appender.setUser(\
appender.setPassword(\
appender.setSql(\
Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\
这里使用的数据库是MySQL 5.0.4beta,用户名root,密码11111111,我在其中建了一个库zheng,包含表log4j,该表只有一个字段msg,类型为 varchar(300)。此外,本例用到的JDBC驱动可以从http://dev.mysql.com/downloads/connector/j/3.1.html下载,版本3.1.8a,下载mysql-connector-java-3.1.8a.zip文件后解压缩,需要其中的mysql-connector- java-3.1.8-bin.jar文件。下面再来看代码。由于JDBCAppender内部默认使用PatternLayout格式化输出信息,因此这里没用到SimpleLayout,而appender.setSql所设置的SQL语句就是PatternLayout所需的格式化字符串,故此其中才有\这样的字符,有关PatternLayout的具体内容后边介绍。执行后,表log4j增加一条记录,内容为\。 8.org.apache.log4j.nt.NTEventLogAppender,向Windows NT系统日志输出信息。 示例代码:
SimpleLayout layout = new SimpleLayout();
NTEventLogAppender appender = new NTEventLogAppender(\
Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\
注意,要完成此示例,还需向 C:\\WINNT\\system32文件夹(我的操作系统装在了C:\\)中复制一个名为NTEventLogAppender.dll的文件。如果跟我一样用的是Log4J 1.2.11,实在对不住,Log4J 1.2.11并未提供该文件。虽然logging-log4j-1.2.11.zip文件解压缩后,其下的src\\java\\org\\apache \\log4j\\nt文件夹中有一个make.bat文件执行后可以编译出该文件,但还需要配置,很麻烦。还好,条条大道通罗马,1.2.11不行,就换 1.2.9,可以从http://apache.justdn.org/logging/log4j/1.2.9下载,下载后解压缩logging-log4j-1.2.9.zip文件,在其下的src\\java\\org\\apache\\log4j\\nt文件夹中找到 NTEventLogAppender.dll,复制过去就可以了。程序执行后,打开\事件查看器\,选择\应用程序日志\,其中有一条来源为Java的记录,这条记录就是刚才输出的信息了。
9.org.apache.log4j.lf5.LF5Appender,执行时会弹出一个窗口,信息在该窗口中以表格的形式显示。 示例代码:
LF5Appender appender = new LF5Appender(); Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\
由于LF5Appender不需要Layout格式化输出信息,因此这里没有设置。此外LF5Appender还提供了一个setMaxNumberOfRecords方法,用来限制信息在表格中显示的行数。 10.org.apache.log4j.net.SocketAppender,以套接字方式向服务器发送日志,然后由
服务器将信息输出。 示例代码:
//指定要连接的服务器地址及端口,这里使用的是本机9090端口
SocketAppender appender = new SocketAppender(\ Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\
SocketAppender不需要设置Layout,因为SocketAppender不负责输出信息。那么如何看到信息输出的效果呢?这就需要SocketServer和 SimpleSocketServer了。 示例代码1:
package piv.zheng.log4j.test;
import org.apache.log4j.net.SocketServer;
public class TestServer {
public static void main(String[] args) {
SocketServer.main(new String[]{\\\ } }
这是 SocketServer的示例。SocketServer只有一个静态方法main,该方法意味着SocketServer不仅可以在代码中被调用,也可以用java命令执行。main方法只有一个参数,是个字符串数组,但要求必须有三个元素:元素一用来指定端口,本例为9090;元素二用来指定输出信息时需要的配置文件,该文件放在工程目录下,本例使用的test.properties内容如下:
log4j.rootLogger=, console
log4j.appender.console =org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.SimpleLayout
该配置指定 SocketServer使用ConsoleAppender以SimpleLayout格式输出信息;元素三用来指定一个路径,以存放.lcf文件,我指定的是本机的G:/YPJCCK/Log4J文件夹。.lcf文件也是输出信息时使用的配置文件,格式与元素二所指定的配置文件一样,但 test.properties是默认配置文件,即当.lcf文件找不到时才使用。那么.lcf文件如何命名呢?其实.lcf文件的名称并不是随意起的,当SocketAppender与SocketServer建立连接时,SocketServer就会获得SocketAppender所在计算机的IP 地址与网络ID,并将其格式化成\网络ID/IP地址\这样的字符串,然后获取其中的网络ID作为.lcf文件的主名,例如\,其中的\就是主文件名,而后再根据这个文件名来调用相应的.lcf文件。这意味着对不同的计算机可以提供不同的配置文件,使信息输出时有不同的效果。此外,SocketServer还默认了一个名为generic.lcf的文件,用于处理网络ID获取不到或其他情况,本例是用的就是这个文件,内容如下: log4j.rootLogger=, console
log4j.appender.console =org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%m%n
该配置指定 SocketServer使用ConsoleAppender以PatternLayout格式输出信息。运行程