??xml version="1.0" encoding="utf-8" standalone="yes"?>
* 验输入是否ؓ正确的日期格?不含U的M情况),严格要求日期正确?格式:yyyy-MM-dd HH:mm
* @param sourceDate
* @return
*/
public static boolean checkDate(String sourceDate){
if(sourceDate==null){
return false;
}
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
dateFormat.setLenient(false);
dateFormat.parse(sourceDate);
return true;
} catch (Exception e) {
}
return false;
}
/**
* Ҏ日期获得日期(不含U的M情况),严格要求日期正确?格式:yyyy-MM-dd HH:mm
* @param sourceDate
* @return
*/
public static Date getDate(String sourceDate) throws DataFormatException{
if(sourceDate==null){
throw new DataFormatException("源数据ؓnull");
}
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
dateFormat.setLenient(false);
return dateFormat.parse(sourceDate);
} catch (Exception e) {
throw new DataFormatException("源数据格式错?);
}
}
//日期格式可以自定?
public static void main(String[] args) throws IOException {
String s="2006-01-30 12:26";
System.out.println(s+"是否为日?"+Test.checkDate(s));
s="2006-1-30 12:26";
System.out.println(s+"是否为日?"+Test.checkDate(s));
s="2006-01-32 12:26";
System.out.println(s+"是否为日?"+Test.checkDate(s));
}
spring自徏事务理模块。而且q个事务理是一个抽象设计,可以应用到很多场合,包括普通的DataSourceQjtaQjms和hibernate上?/p>
要正用spring的事务,首先需要了解spring在事务设计上的一些概?
l观spring事务Q围l着两个核心PlatformTransactionManager和TransactionStatus
PlatformTransactionManager直译q来是q_相关事务Q这里的q_指的是“事务源”,包括刚才我说的DataSourceQjta{等。这些无一不是一个事务源。广义的_凡是可以完成事务性操作的对象Q都可以设计出相对应的PlatformTransactionManagerQ只要这个事务源支持commitQrollback和getTransaction语意?/p>
查看spring代码Q可以发现这些manager实现事务Q就是调用事务源的事务操作方?/p>
比如
HibernateTransactionManager
jdbc 的DataSourceTransactionManager
那么PlatformTransactionManager以什么依据处理事务呢Q?
是TransactionStatus
查看api发现q个接口有三个方?
isNewTransaction() QisRollbackOnly()QsetRollbackOnly()
PlatformTransactionManager是Ҏ前两个方法决定是否要创徏一个新事务Q是要递交q是回滚。至于第三个Ҏ是改变事务当前状态的Q很多地斚w要用刎ͼ偏偏PlatformTransactionManager自n好像不怎么用,毕竟事务状态的改变是由E序员代码决定的Q不需要一个manager多管闲事?/p>
ȝ上面所说的Qspring的事务由PlatformTransactionManager理Qmanager最后调用事务源的方法来实现一个事务过E。而manager通过TransactionStatus 来决定如何实现?
接下去说spring事务中的TransactionTemplate和TransactionInterceptor
TransactionTemplate其实和spring中其他的template的作用类|起到化简代码的作用,不要被它那么长的名字吓倒了Q事实上q个templateq不是什么非常核心的对象。如果比较学I派的,可以ȝ看template设计模式Q在此就不再Ҏ赘述了?
Z么要有TransactionTemplateQ先来看看如果没有TransactionTemplateQ我们的代码该怎么?/p>
先来看看spring reference中的一D代?
同上面的代码如出一辙,前后是事务处理代码,当中那段result = action.doInTransaction(status);是我们的应用代码。至于action是什么,全看各位的需要了。但是有一点要主要Q如果利用TransactionTemplateQ那么他不管你扔Z么异帔R会回滚事务,但是回滚的是哪个事务呢?l箋挖代?
特别是在一些多事务源的E序里,q点千万不能搞错。如果多个事务源之间要完成全局事务Q还是老老实实用分布式事务管理服务吧QjtaQ?/p>
那么TransactionInterceptor是干什么的Q这个是spring 的声明式事务的支持方式。因为用TransactionTemplate要硬~码Q而且调整事务{略很麻烦(不是说不能调。D个例子原来程序抛出异常A需要回滚,现在不需要要Q我可以把a catch吃掉。这时候template׃会回滚了。但是每ơ调整都要重写编码。)而用TransactionInterceptor可以将q些调整写在配置中。我们再来挖TransactionInterceptor的代?/p>
所以用spring的事务管理需要作q些?
1Q设|好事务源,比如DataSourceQhibernate的session。如果有多个事务源要考虑他们之间是否有全局事务Q如果有Q老老实实用jtaQ否则就需要自己写一个manager?
2Q设|managerQ根据你的事务源选择对应的PlatformTransactionManager
3Q选择实现事物的方式,用templateq是interceptor。用template代码直观点,但是template所辖的manager和你应用代码所用的事务源要一致。如果用interceptor千万注意Q一定要调用interceptor那个beanQ而不是原始的那个target。在坛子上我已经看到臛_有两个朋友说spring事物不v作用Q从配置和代码上看都正确Q这时要好好查查Q调用的bean是哪一个?
4Q这个是设计问题了,推荐事务处于一个较高层ơ,比如service上的某个函数Q而底层的dao可以不考虑事务Q否则可能会出现事务嵌套Q增加程序复杂度?/p>
一、创建?br /> 好了Q知道String是非可变cM后,我们可以q一步了解String的构造方式了。创Z个Stirng对象Q主要就有以下两U方式:
虽然两个语句都是q回一个String对象的引用,但是jvm对两者的处理方式是不一L。对于第一U,jvm会马上在heap中创Z个String对象Q然后将该对象的引用q回l用戗对于第二种Qjvm首先会在内部l护的strings pool中通过String?equels Ҏ查找是对象池中是否存放有该String对象Q如果有Q则q回已有的String对象l用P而不会在heap中重新创Z个新的String对象Q如果对象池中没有该String对象Qjvm则在heap中创建新的String对象Q将其引用返回给用户Q同时将该引用添加至strings pool中。注意:使用W一U方法创建对象时Qjvm是不会主动把该对象放到strings pool里面的,除非E序调用 String的internҎ。看下面的例子:
再看下面的例子:
Z么jvm可以q样处理String对象呢?是因ؓString的非可变性。既然所引用的对象一旦创建就怸更改Q那么多个引用共用一个对象时互不影响?/p>
二、串接(ConcatenationQ?br /> javaE序员应该都知道滥用String的串接操作符是会影响E序的性能的。性能问题从何而来呢?归根l底是Stringcȝ非可变性。既然String对象都是非可变的Q也是对象一旦创Z׃能够改变其内在状态了Q但是串接操作明显是要增长字W串的,也就是要改变String的内部状态,两者出C矛盾。怎么办呢Q要l护String的非可变性,只好在串接完成后新徏一个String 对象来表C新产生的字W串了。也是_每一ơ执行串接操作都会导致新对象的生,如果串接操作执行很频J,׃D大量对象的创建,性能问题也就随之而来了?br /> Z解决q个问题Qjdk为StringcL供了一个可变的配套c,StringBuffer。用StringBuffer对象Q由于该cL可变的,串接时仅仅时改变了内部数据结构,而不会创建新的对象,因此性能上有很大的提高。针对单U程Qjdk 5.0q提供了StringBuilderc,在单U程环境下,׃不用考虑同步问题Q用该cM性能得到q一步的提高?/p>
三、String的长?br /> 我们可以使用串接操作W得C个长度更长的字符Ԍ那么QString对象最多能容纳多少字符呢?查看String的源代码我们可以得知cString中是使用?count 来记录对象字W的数量Q而count 的类型ؓ intQ因此,我们可以推测最长的长度?2^32Q也是4G?br /> 不过Q我们在~写源代码的时候,如果使用 Sting str = "aaaa";的Ş式定义一个字W串Q那么双引号里面的ASCII字符最多只能有 65534 个。ؓ什么呢Q因为在class文g的规范中Q?CONSTANT_Utf8_info表中使用一?6位的无符h数来记录字符串的长度的,最多能表示 65536个字节,而java class 文g是用一U变体UTF-8格式来存攑֭W的Qnullg用两个字节来表示Q因此只剩下 65536Q?2 Q?65534个字节。也正是变体UTF-8的原因,如果字符串中含有中文{非ASCII字符Q那么双引号中字W的数量会更(一个中文字W占用三个字节)。如果超个数量,在编译的时候编译器会报错?/p>
public class HelloJob implements Job {
private static Log _log = LogFactory.getLog(HelloJob.class);
public HelloJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
_log.info("要执行的参数如下:");
Iterator i = jobDataMap.entrySet().iterator();
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
_log.info(me.getKey() + ": "+me.getValue());
}
_log.info("U Are Welcome:"+jobDataMap.get("name"));
}
}
二、关于jobdetail:
Quartzq不存储一个真正的Job实例Q相反的Q它通过jobdetail来定义job,q指定job的name和group,在一个调度器QSchedulerQ中,name和group是唯一被定义的Q一个触发器(trigger)只能指定一个job,但多个触发器可以指定同一个job.
三、关于Scheduler
Scheduler的作用就是调用Q务,在指定的旉执行指定的Q务。主要方法如?
scheduleJobҎ:
scheduleJob(JobDetail jobDetail, Trigger trigger):把jobDetaild到调度器中,q指定触发器trigger.在这里要注意Q在同一个调度器中,jobDetail的name和group是唯一?Trigger的name和group也必L唯一的。如果在trigger中指定job的name,则该name必须和jobDetail的name保持一_否则会抛出异常?br /> scheduleJob(Trigger trigger):指定的trigger中必d含jobdetai的name.以便于让quartz知道要执行的dQ如果指定的jobdetail的name不在调度器中的Q务列表中Q则会抛出JobPersistenceException异常?/font>
deleteJob(String jobName,String groupName)Ҏ:
删除指定的job,q且删除所有相兌的触发器。(Delete the identified Job from the Scheduler - and any associated Triggers.Q?/font>
四、关于作业存?br /> Quartz提供两种基本作业存储cd?br />
W一U类型叫做RAMJobStoreQ它利用通常的内存来持久化调度程序信息。这U作业存储类型最Ҏ配置、构造和q行。对许多应用来说Q这U作业存储已l够了。然而,因ؓ调度E序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时Q所有调度信息将被丢失?br />
W二U类型称为JDBC作业存储。Quartz提供两种不同的实玎ͼ但两U实C般都需要JDBC驱动E序和后台数据库来持久化调度E序信息。这两种cd的不同在于你是否惌控制数据库事务或q释放控制给应用服务器例如BEA's WebLogic或Jboss。(q类gJ2EE领域中,Bean理的事务和和容器管理事务之间的区别Q这两种JDBC作业存储是:
· JobStoreTXQ当你想要控制事务或工作在非应用服务器环境中是?Q注Q自己控制事务)?/font>
· JobStoreCMTQ当你工作在应用服务器环境中和想要容器控制事务时使用 (web服务器控制事??/font>
五、关于触发器
Quartz中的触发器用来告诉调度程序作业什么时候触发。框架提供了一把触发器cdQ但两个最常用的是SimpleTrigger和CronTrigger。SimpleTrigger为需要简单打火调度而设计?
典型圎ͼ如果你需要在l定的时间和重复ơ数或者两ơ打火之间等待的U数打火一个作业,那么SimpleTrigger适合你?br />
另一斚wQ如果你有许多复杂的作业调度Q那么或讔R要CronTrigger?
CronTrigger很强大,使用复杂的时间判断来使用Q效果很好?/font>
六、关于Quartz中的几个表:
QRTZ_TRIGGERS 存放Trigger(包括SIMPLE_TRIGGERS和CRON_TRIGGERS)和jobDetail的对应关p?br /> QRTZ_TRIGGER_LISTENERS
QRTZ_SIMPLE_TRIGGERS 存储单触发器
QRTZ_SCHEDULER_STATE
QRTZ_PAUSED_TRIGGER_GRPS
QRTZ_LOCKS
QRTZ_JOB_LISTENERS
QRTZ_JOB_DETAILS 存储jobDetail
QRTZ_FIRED_TRIGGERS
QRTZ_CRON_TRIGGERS 存储复杂触发器CRON_TRIGGERS
QRTZ_CALENDARS
QRTZ_BLOB_TRIGGERS ?/font>
注:q几个表|上q没有相兌明,{研I一D后补充()?/font>
七、把quartz集成到web应用?br /> 1、根据quartz中提供的文档Q徏立数据库.
2、把如下quartz.properties文g攄到classes目录?文g内容如下:
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
#调度器名Q无关紧?名字L?br /> org.quartz.scheduler.instanceName = ZXScheduler
org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool 配置数据库连接池
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 12
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore 配置做业存储方式
#============================================================================
#相当于扫描频率,如果pȝZUQ应Ҏ?000,quartz默认为分U(60000Q?br /> org.quartz.jobStore.misfireThreshold = 1000
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#在这里自己控制事?br /> org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate
org.quartz.jobStore.useProperties = false
#配置dataSource?br /> org.quartz.jobStore.dataSource = myDS
#表前~
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
#============================================================================
# Configure Datasources 配置数据库的q接Q不用解?br /> #============================================================================
org.quartz.dataSource.myDS.driver = com.microsoft.jdbc.sqlserver.SQLServerDriver
org.quartz.dataSource.myDS.URL = jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=quartzTest
org.quartz.dataSource.myDS.user = sa
org.quartz.dataSource.myDS.password = sa
org.quartz.dataSource.myDS.maxConnections = 5
3、配|web.xml,启动quartz的初试化c?d初始化servlet
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>config-file</param-name>
<param-value>quartz.properties</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
4、系l配|完毕?/font>
八、构造cron触发?个h译Q英文不好,莫见W?
cron 触发器规?
Seconds Minutes Hours Day-of-month Month Day-of-Week Year
U ?分 ?时 ?天 ?月 ?周 ?qb?
Seconds 0-59 , - * /
Minutes 0-59 , - * /
Hours 0-23 , - * /
Day-of-month 1-31 , - * ? / L C
Month 1-12 or JAN-DEC , - * /
Day-of-Week 1-7 or SUN-SAT , - * ? / L C #
Year (Optional) empty, 1970-2099 , - * /
关于字符串的讄(在cron expression中所有字W不区分大小?:
The '*' character is used to specify all values. For example, "*" in the minute field means "every minute".
"*"字符被用来指定所有的|例如Q?*"在分钟字D|表示每一分钟
The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify 'no specific value'. This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.
"?"字符在天和周字段中用。表C没有指定|天和周字D|定一个,但不能两个都指定?Q?
The '-' character is used to specify ranges For example "10-12" in the hour field means "the hours 10, 11 and 12".
'-'字符被用来设|范_比如"10-12"在小时字D늚意义?10?11点,12?
The ',' character is used to specify additional values. For example "MON,WED,FRI" in the day-of-week field means "the days Monday, Wednesday, and Friday".
','字符被用来设|添加的|例如在周字段讄"MON,WED,FRI"的意义即?在周一、周三、周五激z?/font>
The '/' character is used to specify increments. For example "0/15" in the seconds field means "the seconds 0, 15, 30, and 45". And "5/15" in the seconds field means "the seconds 5, 20, 35, and 50". You can also specify '/' after the '*' character - in this case '*' is equivalent to having '0' before the '/'.
'/'字符被用来设|增量。例如秒字段讄"0/15"的意思ؓ?开始,?5U触发,卛_0?5?0?5U触发,U字D设|?5/15"的意思ؓQ从5开始,W?5U触发,卛_5?0?5?0U触?你还可以?*'后面使用'/'字符Q在q种情况?*'与字W?0'意义相同?/font>
The 'L' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "last", but it has different meaning in each of the two fields. For example, the value "L" in the day-of-month field means "the last day of the month" - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself, it simply means "7" or "SAT".
But if used in the day-of-week field after another value, it means "the last xxx day of the month" - for example "6L" means "the last friday of the month". When using the 'L' option, it is important not to specify lists, or ranges of values, as you'll get confusing results.
'L'在天字段和周字段中用?L'字符?last'的羃写,但在两个字段中,它有不同的意义。例如,'L'在天字段的意思ؓ月的最后一天,在一月ؓ31Q非闰月2月ؓ28。如果在'L'用在周字D中Q意思ؓ'7'(周六),卛_?一周最后一天。但如果在周字段的另一个值后面,他意味着最后一个星期几在指定月。例?6L'意味着月的最后一个周?在?L'选项Ӟ指定列表或者范围是非常重要的,不然Ҏ被结果搞乱?/font>
The '#' character is allowed for the day-of-week field. This character is used to specify "the nth" XXX day of the month. For example, the value of "6#3" in the day-of-week field means the third Friday of the month (day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of the month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the given day-of-week in the month, then no firing will occur that month.
'#'被用在周字段。它用来指定W几个周几中ȀzR如:"6#3"-->月的W三个周五;"2#1"-->月的W一个周一;"4#5"-->月的W五个周三。要注意Q如果要使用#后面?,但当月ƈ没有W五周相应的周天Q那么job不被执行(Ȁz)Q?/font>
The 'C' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "calendar". This means values are calculated against the associated calendar, if any. If no calendar is associated, then it is equivalent to having an all-inclusive calendar. A value of "5C" in the day-of-month field means "the first day included by the calendar on or after the 5th". A value of "1C" in the day-of-week field means "the first day included by the calendar on or after sunday".
Support for the features described for the 'C' character is not complete
'C'被用在天和周字段中,'C'?calendar'的羃?(不太明白Q关于日历的支持q不完善)
Support for specifying both a day-of-week and a day-of-month value is not complete (you'll need to use the '?' character in on of these fields).
同时在周、天中??'q不完善Q目前只在两者中使用一个?/font>
Pay attention to the effects of '?' and '*' in the day-of-week and day-of-month fields!
要注??'?*'在周和天字段带来的媄响?br /> 注意以下例子:
1?0 15 10 * * 6L 2002-2005" ?002?005q的每月每天?0Q?5触发?br /> 2?0 15 10 ? * 6L 2002-2005" ?002?005q的每月的最后一个周五触发?br /> 1?表示每天Q覆盖了6L(最后一个周?
import java.io.*;
import java.nio.channels.*;
public class OneInstance {
/**
* @param args
*/
public static void main(String[] args) {
try {
System.out.println("progran start ...");
String filename = new String("test.txt");
File testFile = new File(filename);
RandomAccessFile raf;
FileChannel fc;
FileLock fl;
testFile.createNewFile();
if (testFile.canWrite()) {
raf = new RandomAccessFile(testFile, "rw");
fc = raf.getChannel();
fl = fc.tryLock();
if ((fl == null) || (fl.isValid() == false)) {
System.out.println("this is useing by another program!");
} else {
System.out.println("program running...");
Thread.sleep(30 * 1000);
fl.release();
}
raf.close();
}
System.out.println("program end ...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Log4j的配|?
以上是从原理斚w说明Log4j的用方法,在具体Java~程使用Log4j可以参照以下CZQ?br />
1?建立Logger实例Q?br />
语法表示Qpublic static Logger getLogger( String name)
实际使用Qstatic Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ;
2?d配置文gQ?br />
获得了Logger的实例之后,接下来将配置Log4j使用环境Q?br />
语法表示Q?br />
BasicConfigurator.configure()Q自动快速地使用~省Log4j环境?br />
PropertyConfigurator.configure(String configFilename)Q读取用Java的特性文件编写的配置文g?br />
DOMConfigurator.configure(String filename)Q读取XML形式的配|文件?br />
实际使用Q?br />
PropertyConfigurator.configure("ServerWithLog4j.properties");
3?插入日志信息
完成了以上连个步骤以后,下面可以按日志的不同别插入到你要记录日志的Q何地方了?br />
语法表示Q?br />
Logger.debug(Object message);//调试信息
Logger.info(Object message);//一般信?br />
Logger.warn(Object message);//警告信息
Logger.error(Object message);//错误信息
Logger.fatal(Object message);//致命错误信息
实际使用Qlogger.info("ServerSocket before accept: " + server);
配置q程
在实际编E时Q要使Log4j真正在系l中q行事先q要寚w|文件进行定义。定义步骤就是对Logger、Appender及Layout的分别用?br />
Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是java propertiesQkey=valueQ【JavaҎ文Ӟ?|】。下面我们介l用JavaҎ文件做为配|文件的Ҏ
具体如下Q?br />
1、配|根LoggerQ?/strong>其语法ؓQ?br />
log4j.rootLogger = [ level ] , appenderName1, appenderName2, ?br />
level :
是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的别。Log4j只用四个别,?
先从高C分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里?
义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?br />
appenderName:是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?br />
例如Qlog4j.rootLoggerQinfo,A1,B2,C3
2、配|日志信息输出目的地Q其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class //
"fully.qualified.name.of.appender.class" 可以指定下面五个目的C的一个:
1.org.apache.log4j.ConsoleAppenderQ控制台Q?br />
2.org.apache.log4j.FileAppenderQ文Ӟ
3.org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ
4.org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ
5.org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
1.ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层ơ?br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br />
Target=System.errQ默认情况下是:System.out,指定输出控制?br />
2.FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层ơ?br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br />
File=mylog.txt:指定消息输出到mylog.txt文g?br />
Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br />
3.DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层ơ?br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br />
File=mylog.txt:指定消息输出?
mylog.txt文g?br />
Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br />
DatePattern='.'yyyy-ww:每周滚动一ơ文Ӟx周生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小?br />
6)'.'yyyy-MM-dd-HH-mm: 每分?br />
4.RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层ơ?br />
ImmediateFlush=true:默认值是true,?
谓着所有的消息都会被立卌出?br />
File=mylog.txt:指定消息输出到mylog.txt文g?br />
Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br />
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB.
在日志文件到达该大小Ӟ会自动滚动Q即原来的内容Udmylog.log.1文g?br />
MaxBackupIndex=2:指定可以产生的滚动文件的最大数?/font>
实际应用Q?br />
log4j.appender.A1=org.apache.log4j.ConsoleAppender //q里指定了日志输出的W一个位|A1是控制台ConsoleAppender
3、配|日志信息的格式Q其语法为:
A.log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个:
1.org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
2.org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
3.org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
4.org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
1.HTMLLayout 选项
LocationInfo=true:默认值是false,输出java文g名称和行?br />
Title=my app file: 默认值是 Log4J Log Messages.
2.PatternLayout
选项
ConversionPattern=%m%n :指定怎样格式化指定的消息?br />
3.XMLLayout 选项
LocationInfo=true:默认值是false,输出java文g和行?br />
实际应用Q?br />
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
q里需要说明的是日志信息格式中几个符h代表的含义:
QX? X信息输出时左寚wQ?br />
%p: 输出日志信息优先U,即DEBUGQINFOQWARNQERRORQFATAL,
%d: 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd
HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%r: 输出自应用启动到输出该log信息耗费的毫U数
%c: 输出日志信息所属的cȝQ通常是所在类的全?br />
%t: 输出产生该日志事件的U程?br />
%l:
输出日志事g的发生位|,相当?C.%M(%F:%L)的组?包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main
(TestLog4.java:10)
%x: 输出和当前线E相兌的NDC(嵌套诊断环境),其用到像java servletsq样的多客户多线E的应用中?br />
%%: 输出一?%"字符
%F: 输出日志消息产生时所在的文g名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信?br />
%n: 输出一个回车换行符QWindowsq_?\r\n"QUnixq_?\n"输出日志信息换行
可以?与模式字W之间加上修饰符来控制其最宽度、最大宽度、和文本的对齐方式。如Q?br />
1)%20cQ指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q默认的情况下右寚w?br />
2)%-20c:指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q?-"h定左寚w?br />
3)%.30c:指定输出category的名Uͼ最大的宽度?0Q如果category的名U大?0的话Q就会将左边多出的字W截掉,但小?0?
话也不会有空根{?br />
4)%20.30c:如果category的名U小?0pI格Qƈ且右寚wQ如果其名称长于30字符Q就从左边交q销出的字符截掉?/font>
q里上面三个步骤是对前面Log4jlg说明的一个简化;下面l出一个具体配|例子,在程序中可以参照执行Q?br />
log4j.rootLogger=INFO,A1QB2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
Ҏ上面的日志格式,某一个程序的输出l果如下Q?br />
0 INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]
16 DEBUG 2003-06-13
13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri
Jun 13 13:23:46 CST 2003'
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT
4. # 当输Z息于回滚文g?/strong>
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
//指定以文件的方式输出日志
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
//文g位置,也可以用变量${java.home}、rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文g最大尺?br />
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备䆾?br />
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
××××××××××××××××××××××××××××××××××××××××××××××××
Log4j比较全面的配|?
LOG4J的配|之单它遍及于来多的应用中了:Log4J配置文g实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签{全套功能。择其一二用就够用了,
log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.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
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]
n%c[CATEGORY]%n%m[MESSAGE]%n%n
#应用于文?
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
# 应用于文件回?
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log //文g位置,也可以用变量${java.home}、rolling.log
log4j.appender.ROLLING_FILE.Append=true //true:d false:覆盖
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文g最大尺?br />
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备䆾?br />
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
#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志给邮g
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于数据?
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
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
摘自:http://blog.csdn.net/eako/archive/2005/09/23/488099.aspx