log4j

    log4j官方主页 http://logging.apache.org/log4j/

    log4j类图

   log4j

    log4j主要由三大组件构成Logger,Appender,Layout

    Logger 日志写出器,供程序员输出日志信息(用来取代System.out和System.err日志写出器)

    这个类的全名为org.apache.log4j.Logger(注意JDK自带的也有一个java.util.logging.Logger)。

    Logger 继承了 Category 类,所以有如下方法可以调用

  • public void debug(Object msg);
  • public void debug(Object msg, Throwable t);
  • public void info(Object msg);
  • public void info(Object msg, Throwable t);
  • public void warn(Object msg);
  • public void warn(Object msg, Throwable t);
  • public void error(Object msg);
  • public void error(Object msg, Throwable t);
  • public void fatal(Object msg);
  • public void fatal(Object msg, Throwable t);

      

  • Logger 由一个字符串识别,大小写敏感,命名规则为x.y.z,且有继承关系,如x.y是x.y.z的父亲。
  • rootLogger是所有logger祖先。(1,它总是存在;2,它不可通过名字获得)。

       Logger对象生成方式: Logger.getRootLogger();

                                     Logger.getLogger(MyApp.class);

       或者生成 org.apache.commons.logging.Log,生成方式为 LogFactory.getLog(MyApp.class);

       (此时需要引入commons-logging.jar包,通常引入log4j.jar包时也引入此jar包)

       目前 Logger.getLogger(Class clazz) 被认为最理智的命名方式。

     

      Logger Level 日志级别,子类日志级别继承父类日志级别。

      日志级别越低,日志信息越详细。如在debug级别下,可以输出所有日志信息,在info级别下则不能输出debug信息。

      具体级别顺序如下:

      Level.ALL < Level.DEBUG < Level.INFO < Level.WARN <Level.ERROR < Level.FATAL < Level.OFF

     

    Appender 日志输出信息目的地

    一个Logger可以有一个或多个Appender,每一个Appender都可以定义自己的日志文件输出目的地。

    ConsoleAppender可以把日志信息输出到控件台。

    FileAppender 可以把日志信息输出到一个指定日志文件中去。

    RollingFileAppender可以把日志输入到一个指定文件中,不同的是该文件有大小的限制。

    除之之外,还可把日志文件输出到GUI组件、套接字(SocketAppender)、NT事件记录器(NTEventLogAppender)、UNIX Syslog(SyslogAppender) 守护进程中去。

     

    Layout 日志格式化器

    PatternLayout 类似于C语言中printf函数中格式控件字符控制日志文件的输出格式。

    输出参数格式为是 %+[format modifiers]+conversion character

    format modifiers 用来控制字符串长度及字符串左右补值。

    如:

    20 表示最小宽度20个字符,不足补空格,默认右对齐。

    -20 表示最小宽度20个字符,“-”表示左对齐。

    .30 表示最大宽度30个字符,将过30将左边的截取前30个字符,如不超过30个字符,也不补空格。

    conversion character 用为控制输入内容。

    %p 日志信息的优先级 [DEBUG,INFO,ERROR,WARN,ERROR,FATAL]

    %d 时间,可以设置为 %d{yyy MMM dd HH:mm:ss,SSS}

    %r 耗费秒数

    %m 日志具体信息

    %n 输出换行符

     

    log4j 配置文件 log4j.properties

    //1,配置Logger,格式为 log4j.rootLogger = [ level ] , appenderName1, appenderName2, …

    log4j.rootLogger = DEBUG,stdout

    //2,配置Appender 格式为 log4j.appender.appenderName = fully.qualified.name.of.appender.class 

    log4j.appender.stdout = org.apache.log4j.ConsoleAppender

    //3,配置Appender参数 格式为

    //4,配置Layout

    log4j.appender.stdout.layout = org.apache.log4j.Pattern

    //5,配置 Layout 参数

    log4j.appender.stdout.layout.ConversionPattern = %m%n

     

    文章参考内容:

    Apache log4j 学习笔记 http://heavyz.sourceforge.net/homepage/homepage_zh/comp/notes/log4j.html

    log4j配置详解 http://bbs.chinaunix.net/thread-1621517-1-1.html

    log4j使用总结 http://kdboy.javaeye.com/blog/208851

    如何使用log4j http://www.blogjava.net/rickhunter/articles/28133.html

  • posted @ 2010-09-02 02:42 LeoLWang 阅读(246) 评论(0) 编辑
    oracle 
     
    connect by 是结构化查询中用到的,其基本语法如下:
    select … from tablename start with 条件1
    connect by prior 条件2
    where 条件3;
    其中:
    条件1 是根结点限定语句,当然也可以放宽限定条件取多个结点,就形成多根树。
    条件2 是连接条件。
    条件3 是过滤条件,用于所返回的所有记录进行过滤。
     
    例如
    select * from table
    start with fid = ‘G113’
    connect by prior fid = pfid
    where fflag = ‘Y’;
     
    在一个树状存储表中有两个字段,fid和pfid。其中pfid为fid上级记录的id。
    用上述语法的查询可以取得这棵树的所有记录。
     
    扫描顺序:
    1,从根结点开始;
    2,访问该结点;
    3,判断该结点有无被访问的子结点,若有,则转向它的最左侧的的未访问的子结点,并执行第二步,否则执行第四步;
    4,若该结点为根节点,则访问完毕,否则执行第五步;
    5,返回该结点的父结点,并执行第三步;
     
     
    select …
    connect by {prior 列名1=列名2|列名1=prior列名2}
    [start with];
    posted @ 2010-06-08 12:07 LeoLWang 阅读(399) 评论(0) 编辑
    ibatis
    iBATIS报“无效的列类型”异常解决方法

       在一个Java WEB 项目中利用iBATIS调用一个ORACLE的存储过程。其中一个varchar2类型in参数,三个number类型的out参数。在iBATIS配置文件中则定义 varchar2 参数的定义为

    jdbcType=”VARCHAR” javaType=”java.lang.String” mode=”IN”,

    而number类型的参数定义为

    jdbcType=”NUMBER” javaType=”java.math.BigDecimal” mode=”OUT”

    结果报

    Check the output parameters (register output parameters failed). 
    Cause: java.sql.SQLException: 无效的列类型

    异常。

      后来查看java.sql.Types类中有关JDBC类型变量类型,并没有发“NUMBER”这一静态字段,而只有“NUMERIC”字段。(因此 jdbcType 的值不是数据库ORACLE的参数类型,而是其对应的JDBC变量类型)

    但改了之后依然报同样错误。

        后来发现在java.sql.Types类中还有一个DECIMAL静态常量,与javaType定义的java.math.BigDecimal类型一致。

    再修改测试则通过,不再报错。

        所以“无效的列类型”异常解决方法,根据存储过程的参数类型找出正确的jdbcType(具体参考java.sql.Types类的JDBC静态变量)。

    posted @ 2010-03-25 06:50 LeoLWang 阅读(1598) 评论(0) 编辑
    1.新建一个reg文件

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
    @="Delete SVN Folders"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
    @="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

    2.双击运行 reg文件写入注册表

     

    3.最后效果如图所示

    deletesvn

    posted @ 2010-02-23 17:34 LeoLWang 阅读(21) 评论(0) 编辑

    javascript

    JavaScript 特殊关键字

    arguments

    argements.callee

    用于匿名函数递归调用本身

    function makeFactorialFunc()
           {
               //alert("making a factorial function");
               return function(x)
               {
                   if(x<=1) return 1;
                    return x*arguments.callee(x-1);
               }
           }
    alert(makeFactorialFunc()(5));//120
     
     

    function

    function.caller属性

    用于返回调用函数的函数。

    function.apply方法

    Syntax: var result = fun.apply(thisArg[,argsArray);

    应用某一对象的一个方法,用另一个对象替代当前对象。

    prototype

    var Class = {

       create:function(){

          return function(){

             this.initialize.apply(this,arguments);

          }

       }

    }

     

    该对象仅包含一个方法:create,其中一个函数,即类。

    var vehicle = Class.create();

    vehicle.prototype = {

       initialize:function(type){

         this.type = type;

       }

       showSelf:function(){

           alert(“this vehicle is ” + this.type);

       }

    }

    var moto = new vehicle(“Moto”);

    moto.showSelf();

    function.call方法

    syntax: var result = fun.call(thisArg[,arg1[,arg2[,…]]]);

    posted @ 2009-10-29 14:54 LeoLWang 阅读(20) 评论(0) 编辑
    摘要: JavaScript 数据类型 JavaScript 五种基本数据类型 number string boolean true/false null null undefined undefined 可以用typeof检测出来的数据类型number,string,boolean,undefined,object,function (null 类型的唯一值为null类型的是object类型) a...阅读全文
    posted @ 2009-10-28 18:54 LeoLWang 阅读(41) 评论(0) 编辑
    摘要: Oracle 基础笔记6(附录 oracle类型,常用函数,命令,异常) Oracle 数据类型 VARCHAR2(size) 可变长度的字符串,其最大长度为size个字节;size的最大值是4000,而最小值是1;你必须指定一个VARCHAR2的size; NVARCHAR2(size) 可变长度的字符串,依据所选的国家字符集,其最大长度为size个字符或字节;size的最大值取决于储存每...阅读全文
    posted @ 2009-10-15 20:10 LeoLWang 阅读(150) 评论(0) 编辑
    摘要: Oracle基础笔记5(PL/SQL 3) 数据包 定义:定义包的规范 create [or replace] package <数据包名> as --公共类型和对象声明 --子程序说明 end; 定义包的主体 create [or replace] package body <数据包名> as -- 公共类型和对象声明 --子程序主体 begin --初始化语句 ...阅读全文
    posted @ 2009-10-15 19:52 LeoLWang 阅读(104) 评论(0) 编辑
    摘要: Oracle 基础笔记 4(PL/SQL 2) PL/SQL表 pl/sql表只有两列,其中第一列为序号列为integer类型,第二列为用户自定义列。 定义:TYPE <类型名> IS TABLE OF <列的类型> [NOT NULL] INDEX BY BINARY_INTEGER; <列的类型>可以为Oracle的数据行以及自定义类型; 属性方法: .co...阅读全文
    posted @ 2009-10-15 10:45 LeoLWang 阅读(108) 评论(0) 编辑
    摘要: Oracle 基础笔记3 (PL/SQL 1) 基本结构 PL/SQL结构 declare 声明部分 begin 执行部分 exception 异常处理部分 end; 变量声明 <变量名> 类型[:=初始值]; 特殊类型 字段%type 表%rowtype 常量声明 <变量名> CONSTANT 类型:=初始值; 全局变量声明 VARIABLE <变量名&g...阅读全文
    posted @ 2009-10-14 20:17 LeoLWang 阅读(132) 评论(0) 编辑