JRT调试优化

JRT提供的是业务脚本化,在Windows下开发时候有问题时候可以借助System.out.prinln输出信息到tomcat的控制台来调试程序。在Linux上发布后看输出就得到catalina.out里,这样虽然也能用xftp连着看日志,但是有个致命问题是:部署环境有很多用户在使用,输出日志的话日志太多了,根本难以辅助跟踪问题(开发环境只有一个人用就好查日志)。

演示视频

为了简化JRT跟踪问题,设计新的日志跟踪体系:

在这里插入图片描述

在这里插入图片描述

在业务基类里共提供zw、zwg、zwu、zwk几个写日志的方法。其中zw输出日志到相同IP的调试端,zwg输出到登录相同组的调试端、zwu输出到相同登录用户的调试端、zwk输出到指定key的调试端。最常用的是zw,自己操作网站功能来调试程序、然后是zwk适用于外部接口调用的逻辑、操作地方不在本机、也没有会话和组。zwu和zwg适合有些操作只有用户才能重现的时候写日志。

跟踪日志会话的对象:


package JRT.Core.Debug;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;

/**
 * 调试会话对象
 */
public class DebugSession {
    /**
     * 前端最后查询时间,长时间没被查询的会话就去除会话
     */
    public long LastSelectTime;

    /**
     * 调试会话唯一键,用IP-用户-组构成
     */
    private String SessionKey;

    /**
     * 按自定义键写日志
     */
    public String SelfKey;

    /**
     * 按IP写日志
     */
    public String IpAddr;

    /**
     * 按GroupID写日志
     */
    public String GroupID;

    /**
     * 按UserID写日志
     */
    public String UserID;

    /**
     * 日志缓存队列
     */
    public ConcurrentLinkedDeque<String> LogQueue;
}

日志管理器:


package JRT.Core.Debug;

import java.util.*;
import java.util.concurrent.ConcurrentLinkedDeque;

import JRT.Core.Debug.DebugSession;

/**
 * 管理调试信息
 */
public class DebugManager {
    /**
     * 存储调试会话
     */
    private static HashMap<String, DebugSession> SessionMap=new HashMap<>();

    /**
     * 按IP地址写日志
     * @param ipAddr ip
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public static void ZW(String ipAddr,Object obj,String title) throws Exception
    {
        boolean hasOut=false;
        //使用迭代器遍历
        Iterator<HashMap.Entry<String, DebugSession>> iterator = SessionMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, DebugSession> entry = iterator.next();
            //两分钟不活动的会话就移除
            if (JRT.Core.Util.TimeParser.GetTimeInMillis()-entry.getValue().LastSelectTime>120000) {
                iterator.remove();
                continue;
            }
            //按IP写日志
            DebugSession one=entry.getValue();
            if(one.IpAddr.equals(ipAddr))
            {
                String logStr="[Usr:"+one.UserID+"#Grp:"+one.GroupID+"#"+JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj);
                one.LogQueue.addLast(logStr);
                System.out.println(logStr);
                hasOut=true;
            }
        }
        if(hasOut==false)
        {
            System.out.println(JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj));
        }
    }

    /**
     * 按自定义Key写日志
     * @param selfKey 自定义Key
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public static void ZWK(String selfKey,Object obj,String title) throws Exception
    {
        boolean hasOut=false;
        //使用迭代器遍历
        Iterator<HashMap.Entry<String, DebugSession>> iterator = SessionMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, DebugSession> entry = iterator.next();
            //两分钟不活动的会话就移除
            if (JRT.Core.Util.TimeParser.GetTimeInMillis()-entry.getValue().LastSelectTime>120000) {
                iterator.remove();
                continue;
            }
            //按IP写日志
            DebugSession one=entry.getValue();
            if(one.SelfKey.equals(selfKey))
            {
                String logStr="[Usr:"+one.UserID+"#Grp:"+one.GroupID+"#"+JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj);
                one.LogQueue.addLast(logStr);
                System.out.println(logStr);
                hasOut=true;
            }
        }
        if(hasOut==false)
        {
            System.out.println(JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj));
        }
    }

    /**
     * 按登录组写日志
     * @param groupID 组
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public static void ZWG(String groupID,Object obj,String title) throws Exception
    {
        boolean hasOut=false;
        //使用迭代器遍历
        Iterator<HashMap.Entry<String, DebugSession>> iterator = SessionMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, DebugSession> entry = iterator.next();
            //两分钟不活动的会话就移除
            if (JRT.Core.Util.TimeParser.GetTimeInMillis()-entry.getValue().LastSelectTime>120000) {
                iterator.remove();
                continue;
            }
            //按组写日志
            DebugSession one=entry.getValue();
            if(one.GroupID.equals(groupID))
            {
                String logStr="[Usr:"+one.UserID+"#Grp:"+one.GroupID+"#"+JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj);
                one.LogQueue.addLast(logStr);
                System.out.println(logStr);
                hasOut=true;
            }
        }
        if(hasOut==false)
        {
            System.out.println(JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj));
        }
    }

    /**
     * 按用户写日志
     * @param userID 用户
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public static void ZWU(String userID,Object obj,String title) throws Exception
    {
        boolean hasOut=false;
        //使用迭代器遍历
        Iterator<HashMap.Entry<String, DebugSession>> iterator = SessionMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, DebugSession> entry = iterator.next();
            //两分钟不活动的会话就移除
            if (JRT.Core.Util.TimeParser.GetTimeInMillis()-entry.getValue().LastSelectTime>120000) {
                iterator.remove();
                continue;
            }
            //按用户写日志
            DebugSession one=entry.getValue();
            if(one.UserID.equals(userID))
            {
                String logStr="[Usr:"+one.UserID+"#Grp:"+one.GroupID+"#"+JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj);
                one.LogQueue.addLast(logStr);
                System.out.println(logStr);
                hasOut=true;
            }
        }
        if(hasOut==false)
        {
            System.out.println(JRT.Core.Util.TimeParser.GetNowTimeStr()+"]#   "+title+"="+ JRT.Core.Util.JsonUtil.Object2Json(obj));
        }
    }

    /**
     * 开启调试会话
     * @param ipAddr ip地址
     * @param userID 用户
     * @param groupID 组
     * @param selfKey 自定义键
     */
    public static void StartDebugSession(String ipAddr,String userID,String groupID,String selfKey)
    {
        //构造会话
        String key=ipAddr+"-"+userID+"-"+groupID;
        DebugSession session=new DebugSession();
        session.SelfKey=selfKey;
        session.IpAddr=ipAddr;
        session.UserID=userID;
        session.GroupID=groupID;
        session.LastSelectTime= JRT.Core.Util.TimeParser.GetTimeInMillis();
        session.LogQueue=new ConcurrentLinkedDeque<String>();
        SessionMap.put(key,session);
        //移除不活动会话
        CheckOutTimeSession();
    }

    /**
     * 停止调试会话
     * @param ipAddr ip地址
     * @param userID 用户
     * @param groupID 组
     */
    public static void StopDebugSession(String ipAddr,String userID,String groupID)
    {
        //构造会话
        String key=ipAddr+"-"+userID+"-"+groupID;
        if(SessionMap.containsKey(key))
        {
            SessionMap.remove(key);
        }
        //移除不活动会话
        CheckOutTimeSession();
    }

    /**
     * 得到日志数据
     * @param ipAddr ip地址
     * @param userID 用户
     * @param groupID 组
     * @return 日志数据
     * @throws Exception
     */
    public static String GetLogs(String ipAddr,String userID,String groupID) throws Exception
    {
        String key=ipAddr+"-"+userID+"-"+groupID;
        HashMap retMap=new HashMap();
        List<String> logList=new ArrayList<>();
        if(SessionMap.containsKey(key))
        {
            DebugSession one=SessionMap.get(key);
            one.LastSelectTime= JRT.Core.Util.TimeParser.GetTimeInMillis();
            while (one.LogQueue.size()>0)
            {
                logList.add(one.LogQueue.poll());
            }

        }
        retMap.put("Logs",logList);
        retMap.put("SessionNum",SessionMap.size());
        return JRT.Core.Util.JsonUtil.Object2Json(retMap);
    }

    /**
     * 查询长时间没活动的会话清除
     */
    public static void CheckOutTimeSession()
    {
        try {
            //使用迭代器安全地删除元素
            Iterator<HashMap.Entry<String, DebugSession>> iterator = SessionMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, DebugSession> entry = iterator.next();
                //两分钟不活动的会话就移除
                if (JRT.Core.Util.TimeParser.GetTimeInMillis() - entry.getValue().LastSelectTime > 120000) {
                    iterator.remove();
                }
            }
        }
        catch (Exception ex)
        {
            JRT.Core.Util.LogUtils.WriteExceptionLog("检测超时的调试会话",ex);
        }
    }
}

业务基类提供的写日志方法:

/**
     * 按照客户端IP地址输出日志
     * @param obj 对象
     * @throws Exception
     */
    public void zw(Object obj) throws Exception
    {
        DebugManager.ZW(JRTContext.GetClientIP(Request),obj,"obj");
    }

    /**
     * 按照客户端IP地址输出日志
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public void zw(Object obj,String title) throws Exception
    {
        DebugManager.ZW(JRTContext.GetClientIP(Request),obj,title);
    }

    /**
     * 按照自定义键输出日志
     * @param selfkey 自定义键
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public void zwk(String selfkey,Object obj,String title) throws Exception
    {
        if(selfkey==null)
        {
            return;
        }
        DebugManager.ZWK(selfkey,obj,title);
    }

    /**
     * 按照自定义键输出日志
     * @param selfkey 自定义键
     * @param obj 对象
     * @throws Exception
     */
    public void zwk(String selfkey,Object obj) throws Exception
    {
        if(selfkey==null)
        {
            return;
        }
        DebugManager.ZWK(selfkey,obj,"obj");
    }

    /**
     * 按照登录的GroupID输出日志
     * @param obj 对象
     * @throws Exception
     */
    public void zwg(Object obj) throws Exception
    {
        DebugManager.ZWG(UserLogin().GroupID,obj,"obj");
    }

    /**
     * 按照登录的GroupID输出日志
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public void zwg(Object obj,String title) throws Exception
    {
        DebugManager.ZWG(UserLogin().GroupID,obj,title);
    }

    /**
     * 按照登录的UserID输出日志
     * @param obj 对象
     * @throws Exception
     */
    public void zwu(Object obj) throws Exception
    {
        DebugManager.ZWU(UserLogin().UserID,obj,"obj");
    }

    /**
     * 按照登录的UserID输出日志
     * @param obj 对象
     * @param title 标题
     * @throws Exception
     */
    public void zwu(Object obj,String title) throws Exception
    {
        DebugManager.ZWU(UserLogin().UserID,obj,title);
    }
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2020年是“jrt0166”的发展之年。在这一年,jrt0166迎来了许多重要的事件和转折点。 首先,jrt0166在2020年取得了巨大的发展和成就。他们成功推出了多个创新产品,并在市场上获得了广泛认可和赞誉。jrt0166团队经过不懈努力,不断改进和创新,使其产品在质量和性能方面不断提高,赢得了许多忠实的用户。 其次,2020年也是jrt0166公司扩大市场份额的一年。他们积极参加各种国内外展览和行业会议,与客户和合作伙伴广泛交流,拓展了合作关系。通过不断增强市场竞争力,他们成功进入了新的市场领域,为公司的长远发展打下了坚实基础。 此外,2020年也是jrt0166注重企业文化建设和员工培养的一年。他们积极组织各种培训和活动,提升员工的技能和动力。公司注重员工的职业发展和个人成长,并提供了广阔发展空间,使员工感受到公司的关心和支持。 最后,2020年也带来了一些挑战和困难。例如,全球爆发的COVID-19疫情对全球经济造成了巨大冲击,jrt0166也不例外。然而,面对挑战,jrt0166团队坚定信心,灵活应对,并采取了一系列应对措施,保持了公司的正常运营,并取得了不俗的业绩。 综上所述,2020年对于jrt0166来说是一个充满挑战和机遇的年份。通过不懈努力,创新实践和灵活应对,jrt0166成功地应对了各种挑战,并取得了长足发展,为公司的未来发展奠定了坚实基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值