日志分析实用类

本贴最后更新于 2248 天前,其中的信息可能已经沧海桑田

1、从日志中提取需要的信息,并计算,方法如下:

/**
     * 数据提取计算
     * @param filepath
     */
    public static void Txt(String filepath) {
        String encoding = "gbk";//txt一般默认编码为gbk
        File file = new File(filepath);
        if (file.exists() && file.isFile()) {
            try {
                InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
                BufferedReader bufferedReader = new BufferedReader(read);
                Map<String, List<Integer>> resultMapTotal = new HashMap<>();
                Map<String, Integer> resultMap = new HashMap<>();

                String txtLine = "";
                while ((txtLine = bufferedReader.readLine()) != null) {
                    String[] methodAndTime = txtLine.split("====")[1].split(" ");
                    //包含key,追加,不包含则写入
                    if (resultMapTotal.containsKey(methodAndTime[1])) {
                        List list = resultMapTotal.get(methodAndTime[1]);
                        list.add(Integer.valueOf(methodAndTime[5]));
                        resultMapTotal.put(methodAndTime[1], list);
                    } else {
                        List<Integer> list = new ArrayList();
                        list.add(Integer.valueOf(methodAndTime[5]));
                        resultMapTotal.put(methodAndTime[1], list);
                    }

                }
                Iterator<String> it = resultMapTotal.keySet().iterator();
                while (it.hasNext()) {
                    String key = it.next();
                    List listSort = resultMapTotal.get(key);
                    List<Integer> resultList = new ArrayList<>();
                    //降序排序
                    Collections.sort(listSort, Collections.reverseOrder());
                    //最大时间
                    String maxTime = Integer.toString((int) listSort.get(0));
                    //最小时间
                    String minTime = Integer.toString((int) listSort.get(listSort.size() - 1));
                    //调用次数
                    String totalNum = Integer.toString(listSort.size());
                    //中间值
                    String median = Integer.toString((int) listSort.get(listSort.size() / 2));
                    //100毫秒内占比
                    int proportionNum100 = 0;
                    //200毫秒内占比
                    int proportionNum200 = 0;
                    //300毫秒内占比
                    int proportionNum300 = 0;
                    //平均调用时间
                    int totalavg = 0;
                    for (int i = 0; i < listSort.size(); i++) {
                        totalavg = (int) listSort.get(i) + totalavg;
                        if ((int) listSort.get(i) <= 100) {
                            proportionNum100++;
                        }
                        if ((int) listSort.get(i) <= 200) {
                            proportionNum200++;
                        }
                        if ((int) listSort.get(i) <= 300) {
                            proportionNum300++;
                        }
                    }
                    //平均调用时间
                    int numavg = totalavg / listSort.size();
                    //100毫秒内占比
                    String proportion100 = (float) proportionNum100 * 100 / listSort.size() + "%";
                    //200毫秒内占比
                    String proportion200 = (float) proportionNum200 * 100 / listSort.size() + "%";
                    //300毫秒内占比
                    String proportion300 = (float) proportionNum300 * 100 / listSort.size() + "%";

                    //90%调用时间
                    int total = (int) listSort.get(new BigDecimal(listSort.size() * 0.1).setScale(0, BigDecimal.ROUND_HALF_UP).intValue());
                    //90%调用时间
                    String num90 = Integer.toString(total/* / listSort.size()*/);
                    //System.out.println(key+"."+maxTime+"."+minTime);
                    resultMap.put(key + " " + num90 + " " + maxTime + " " + minTime + " " + median + " " + proportion100 + " " + proportion200 + " " + proportion300 + " " + totalNum, numavg);

                }
                deriveTable(resultMap);
                System.out.println("导出完成");
                read.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

2、将提取的数据放入 Map 中,根据 value 进行排序,并导出 excel 表格,方法如下:

/**
     * Map类型数据按value排序,并导出excel
     *
     * @param map
     */
    public static void deriveTable(Map<String, Integer> map) {
        //Map<String,Integer> map1 =
        //排序规则
        Comparator<Map.Entry<String, Integer>> valueComparator = new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        };

        // map转换成list进行排序
        List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());

        // 排序
        Collections.sort(list, valueComparator);

        // 创建Excel文件对应的对象
        HSSFWorkbook hwk = new HSSFWorkbook();
        // 创建一个sheet表名
        HSSFSheet hssfSheet = hwk.createSheet("接口平均速度统计");

        // 默认情况下,TreeMap对key进行降序排序
        System.out.println("------------map按照value降序排序--------------------");
        // 通过sheet创建一盒row(行) 范围0-65535
        HSSFRow hssfRowHead1 = hssfSheet.createRow(0);

        String[] heads = {"接口名称", "平均调用耗时(ms)", "90% Line", "最大调用时间(ms)", "最小调用时间(ms)", "中间值(ms)", "100毫秒内占比", "200毫秒内占比", "300毫秒内占比", "调用次数"};

        for (int i = 0; i < heads.length; i++) {
            HSSFCell cellHead = hssfRowHead1.createCell(i);
            cellHead.setCellValue(heads[i]);
        }

        int index = 0;
        for (Map.Entry<String, Integer> entry : list) {
            index++;
            System.out.println(entry.getKey());
            String[] subString = entry.getKey().split(" ");
            HSSFRow hssfRow = hssfSheet.createRow(index);

            HSSFCell cell = hssfRow.createCell(0);
            cell.setCellValue(subString[0]);

            HSSFCell cell1 = hssfRow.createCell(1);
            cell1.setCellValue(entry.getValue());
            System.out.println("subString.length"+subString.length);
            for (int a = 1; a < subString.length; a++) {
                HSSFCell cell3 = hssfRow.createCell(a+1        );
                cell3.setCellValue(subString[a]);
            }

        }

        FileOutputStream fos = null;
        try {
            File file = new File("e:/接口平均时间统计.xls");
            if (file.exists()) {
                file.delete();
            }
            fos = new FileOutputStream("e:/接口平均时间统计.xls");
            hwk.write(fos);
        }catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • UUUS

    很强势

推荐标签 标签

  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 124 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 682 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 659 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 10 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 374 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 618 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    130 引用 • 793 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 624 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 669 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    408 引用 • 3574 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 631 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 385 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22370 引用 • 89532 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 411 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 552 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 681 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 462 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 722 关注