日志分析实用类

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

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思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • Java

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

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

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

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

    很强势

推荐标签 标签

  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 6 关注
  • 前端

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

    247 引用 • 1347 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 399 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 319 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Vim

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

    27 引用 • 66 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 498 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 623 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 605 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 407 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 2 关注
  • 996
    13 引用 • 200 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 166 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 495 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 13 关注
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖 • 1 关注