有关在EMP中使用日志分析工具(gardener.jar)的说明

来源:互联网 发布:unity3d发布到网页 编辑:程序博客网 时间:2024/06/07 14:32

有关在EMP中使用日志分析工具(gardener.jar)的说明

(Gardener工具源自网银产品的日志规范,用于分析交易访问日志。通过此工具可分析出一笔交易的关键路径,及在每路径上的耗时,具体内容不属于本贴关注范围。)

在EMP 2.1版本(EMP 20090313之后)中已经提供了对该功能的支持,如要在应用中使用该功能,需要遵循以下步骤:
1.启动交易耗时记录:
(如不作该项处理,则在EMP中不进行交易耗时记录,所以对于正在应用emp且不关注本项功能的项目没有任何影响
在应用的web.xml中,增加下面的定义:
    <context-param>
      <param-name>timeRecorderImplClass</param-name>
      <param-value>com.ecc.emp.timerecorder.GardenerRecorderImpl</param-value>
    </context-param>

2.定义在哪个环境统计交易耗时:
在empServletContext.xml文件中,增加下面的定义
    <accessManager id="..." ...>
        <accessController id="aController" class="com.ecc.emp.timerecorder.TimerRecorderAccessController" txcodeField="TXCODE">
        </accessController>
    </accessManager>
目前做法是通过EMP的access controller机制实现耗时统计,可支持一般的BS应用,以及HTTP的渠道接入应用,但不支持TCPIP的渠道接入应用。

3.在logging.xml文件中增加以下定义(这是gardener的要求):
    <appender name="TRANSACCESS_FILE" class="org.apache.log4j.DailyRollingFileAppender">         
        <param name="File" value="${ROOTPATH}WEB-INF/logs/emp_gardner.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{ISO8601} - %m%n" />
        </layout>
    </appender>
         
    <category name="EBANK.transAccess" additivity="false">
        <priority value="info" />
        <appender-ref ref="TRANSACCESS_FILE" />     
    </category>
由于gardener工具,要求输出日志行包括,分行号、交易码等信息,而EMP这种纯技术平台无法提供这些内容,所以在项目中通常需要重新撰写access controller来实现。
现将EMP的默认实现代码,提供如下,大家可以依项目情况来进行扩展。

===============================================================
package com.ecc.emp.timerecorder;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import com.ecc.emp.accesscontrol.AccessController;
import com.ecc.emp.core.Context;
import com.ecc.emp.core.EMPConstance;
import com.ecc.emp.core.EMPException;

public class TimerRecorderAccessController implements AccessController {

        private String txcodeField = "txcode";

        private String branchCodeField = "branchCode";

        private String sequenceNoField = "sequenceNo";

        private String errCodeField = "errCode";

        private String hostErrCodeField = "hostErrCode";

        public void beginAccess(Object accessInfo) {
                EMPTimerRecorder.setStart(accessInfo);
        }

        public Object checkAccess(Context context, Object requestObj,
                        String actionId) throws EMPException {
                return requestObj;
        }

        public void endAccess(Object accessInfo, long beginTimeStamp) {
                Context context = (Context) ((HttpServletRequest) accessInfo)
                                .getAttribute(EMPConstance.ATTR_CONTEXT);
                HashMap map = new HashMap();

                String fieldValue = null;
                try {
                        fieldValue = (String)context.get(txcodeField);
                } catch (RuntimeException e) {
                }
                if (fieldValue == null) {
                        fieldValue = "";
                }
                map.put("txcode", fieldValue);

                fieldValue = null;
                try {
                        fieldValue = (String)context.get(branchCodeField);
                } catch (RuntimeException e) {
                }
                if (fieldValue == null) {
                        fieldValue = "";
                }
                map.put("branchCode", fieldValue);
               
                fieldValue = null;
                try {
                        fieldValue = (String)context.get(sequenceNoField);
                } catch (RuntimeException e) {
                }
                if (fieldValue == null) {
                        fieldValue = "";
                }
                map.put("sequenceNo", fieldValue);
               
                fieldValue = null;
                try {
                        fieldValue = (String)context.get(errCodeField);
                } catch (RuntimeException e) {
                }
                if (fieldValue == null) {
                        fieldValue = "";
                }
                map.put("errCode", fieldValue);
               
                fieldValue = null;
                try {
                        fieldValue = (String)context.get(hostErrCodeField);
                } catch (RuntimeException e) {
                }
                if (fieldValue == null) {
                        fieldValue = "";
                }
                map.put("hostErrCode", fieldValue);

                EMPTimerRecorder.logEnd(accessInfo, map);
        }

        public void setBranchCodeField(String branchCodeField) {
                this.branchCodeField = branchCodeField;
        }

        public void setErrCodeField(String errCodeField) {
                this.errCodeField = errCodeField;
        }

        public void setHostErrCodeField(String hostErrCodeField) {
                this.hostErrCodeField = hostErrCodeField;
        }

        public void setSequenceNoField(String sequenceNoField) {
                this.sequenceNoField = sequenceNoField;
        }

        public void setTxcodeField(String txcodeField) {
                this.txcodeField = txcodeField;
        }
}

对于自扩展的EMPAction,只要添加类似下面的代码即可:
long beginTime=System.currentTimeMillis();
....
try{
...
}catch(...){
...
}finally{
                        long timeCost=System.currentTimeMillis()-beginTime;                       
                        EMPTimerRecorder.addThreadValue(EMPTimerRecorder.TYPE_COMM, timeCost);//可选计时分类还包括TYPE_DBACCESS,TYPE_COMM,TYPE_JSP
                }
原创粉丝点击