69. XPages里的Java日志器(一)

2014-11-24 08:20:07 · 作者: · 浏览: 3
在48. 面向对象的LotusScript(十四)之Log4Dom上和49. 面向对象的LotusScript(十五)之Log4Dom下笔者介绍了一个简单实用的日志记录模块,代码用LotusScript写成,在Lotus Notes传统的客户端和web应用程序里都可以使用。在XPages开发里,需要可在SSJS或Java里使用的日志功能。用Java开发时,有很多现成的日志框架,比如Log4J和JDK自带的java.util.logging包。但是这些框架包含日志器层次(logger hierarchy)、过滤器(filter)、记录器(handler)和格式器(formatter)等特性,对于Lotus Notes平台上的开发来说过于复杂。Lotus Notes的环境有特殊性,现成和方便的记录日志的载体就是Notes文档,所以笔者在借鉴了OpenNTF上的Log4Dom项目后,编写了满足典型的Lotus Notes里日志需求的Java类NotesLogger。(与Log4Dom的Java版本比较,NotesLogger放弃了Log4J的可配制记录器的架构,直接将日志写入唯一的载体――指定Notes 数据库的文档;更正了bug;简化了使用方法;减少了类的数量;调整了方法的名称和签名。)记录日志的文档使用的表单和视图与LotusScript的Log4Dom一样。下面就是在一个XPage的按钮里分别用xp:eventHandler的action和actionListener属性触发managed bean里的两个测试方法,分成两条日志文档。
	
  
		
    
   
	
  
	
  
		
    
   
	
  	
注意两处绑定使用的都是表达式语言,并且XPages继承自JSF,分别可以使用action和actionListener/actionListeners绑定两种签名不同的方法。action属性绑定的方法须为managed bean的公开方法,无参数且返回一个字符串;actionListener/actionListeners绑定的方法同样须为公开方法,但接受一个类型为javax.faces.event.ActionEvent的参数且返回类型为void。
    public void testActionListener(ActionEvent ae) throws NotesException{
        NotesLogger logger=new NotesLogger(XSPUtil.getSession());
        logger.setLogName("test actionListener from bean");
        logger.info(ae);
        logger.close();
    }
    
    public void testAction() throws NotesException{
        NotesLogger logger=new NotesLogger(XSPUtil.getSession());
        logger.setLogName("test action from bean");
        logger.info("Print message from NotesLogger");
        logger.close();
    }
产生的日志如下:
\
\
\
我们还可以稍微再简化一下NotesLogger的调用步骤。在一个managed bean里,很多方法都可能会写日志,我们可以在bean里声明一个logger字段作为共享的日志器,在bean的构造方法里或者利用managed bean的managed prZ http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcGVydHmz9cq8u69sb2dnZXKx5MG/o6zI57TL0rvAtNTaw7+49re9t6jQtMjV1r7KsaOsvs2/ycqhyKW0tL2oyNXWvsb3tcS7t73aoaM8YnIgLz7PwsPmysfOqrTL0LS1xGZhY2VzLWNvbmZpZy54bWyjujxiciAvPjxwcmUgY2xhc3M9"brush:java;"> logger starrow.BeanLogger application bean starrow.Test session logger #{logger} 和相应的bean的片段:
    private BeanLogger logger;

    public void setLogger(BeanLogger logger) {
        this.logger = logger;
    }
    public void test() throws NotesException{
        logger.setLogName("from bean logger");
        logger.debug(1);
        logger.info("text");
        logger.warn(true);
        logger.error(new Date());
        String user=XSPUtil.getSession().getEffectiveUserName();
        logger.info("user: " + user);
        logger.flush();
        logger.close();
    }
产生的日志如下:
\
\
注意上面使用的日志类是BeanLogger,这是为了能将NotesLogger作为managed bean使用而继承自它的一个扩展类。
最后,我们来看看NotesLogger和BeanLogger的代码。
package starrow;

import lotus.domino.*;

import java.util.*;
import java.text.SimpleDateFormat;

/**
 * Log to Notes documents
 */

public class NotesLogger {

    // built in logging levels
    public static final int LEVEL_DEBUG=5;
    public static final int LEVEL_INFO=4;
    public static final int LEVEL_WARN = 3;
    public static final int LEVEL_ERROR=2;
    public static final int LEVEL_FATAL=1;
    public static final int LEVEL_NONE=0;

    // the string version
    public static final String LEVEL_DEBUG_STRING = "DEBUG";
    public static final String LEVEL_INFO_STRING = "INFO";
    public static final String LEVEL_WARN_STRING="WARN";
    public static final String LEVEL_ERROR_STRING="ERROR";
    public static final String LEVEL_FATAL_STRING="FATAL";


    protected int logLevel;
    pr