【问题标题】:Extracting data from log file [closed]从日志文件中提取数据[关闭]
【发布时间】:2016-10-09 10:20:59
【问题描述】:

我有一个包含以下代码的日志文件...我想使用日志文件作为输入并过滤用户名、日期并计算编号。对于每个用户名,客户端断开连接、客户端连接和数据包丢失的次数............ 日志样本:

[ComputerC7] UserName:ABC1  id:02 | (11/22/2016 01:20:03) | Client connected.  

[ComputerC8] UserName:ABC2  id:01 | (11/24/2016 03:10:35) | Client disconnected. 

[ComputerC9] UserName:ABC5  id:04 | (11/25/2016 01:20:35) | Packet drop. 

[ComputerC7] UserName:ABC1  id:02 | (11/22/2016 01:20:03) | Packet drop. 

我需要有唯一的列表用户。并分别显示每天的已连接、已断开、丢包计数。这肯定需要一些 java 代码和正则表达式。

输出:

UserName: ABC1 Date:11/22/2016 Connected :1 Disconnected :0 Packet Drop:1
UserName: ABC2 Date:11/24/2016 Connected :0 Disconnected :1 Packet Drop:0
UserName: ABC5 Date:11/25/2016 Connected :0 Disconnected :0 Packet Drop:1

【问题讨论】:

  • 欢迎来到 Stack Overflow!请查看how to ask 以改进您的问题。发布您尝试过的代码和您收到的错误。尽可能具体,因为它会带来更好的答案。

标签: java regex file-handling


【解决方案1】:

这是您在 SO 中第一个问题的完整答案。请确保在以后的帖子中展示您尝试过的内容。

这是您需要尝试的正则表达式:

"UserName:([^\\s]*)(?:[^\\(]*)\\(([^\\s]*)[^\\|]*\\|\\s*([^\\.]*)"

要获得您想要的结果,您可以尝试以下方法。

package rejex;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Maverick
 */
public class Starter {

    public static HashMap<String, props> resultMap;
    public static final String regex = "UserName:([^\\s]*)(?:[^\\(]*)\\(([^\\s]*)[^\\|]*\\|\\s*([^\\.]*)";
    public static final String string = "[ComputerC7] UserName:ABC1 id:02 | (11/22/2016 01:20:03) | Client connected.\n\n"
            + "[ComputerC8] UserName:ABC2 id:01 | (11/24/2016 03:10:35) | Client disconnected.\n\n"
            + "[ComputerC9] UserName:ABC5 id:04 | (11/25/2016 01:20:35) | Packet drop.\n\n"
            + "[ComputerC7] UserName:ABC1 id:02 | (11/22/2016 01:20:03) | Packet drop.\n\n";

    public static void main(String[] args) {

        Starter starter = new Starter();
        starter.process();

        for (String key : resultMap.keySet()) {
            System.out.print(key);
            System.out.print(" Connected :" + resultMap.get(key).clientConnected);
            System.out.print(" Disconnected :" + resultMap.get(key).clientDisconnected);
            System.out.println(" Packet Drop :" + resultMap.get(key).packetDrop);
        }
    }

    public void process() {
        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);
        String key = "";
        resultMap = new HashMap<String, props>();
        while (matcher.find()) {
            key = "UserName: " + matcher.group(1) + " Date:" + matcher.group(2);
            if (resultMap.containsKey(key)) {
                resultMap.put(key, resultMap.get(key).increment(matcher.group(3)));
            } else {
                resultMap.put(key, new props().increment(matcher.group(3)));
            }

        }
    }

    public class props {

        int clientDisconnected;
        int clientConnected;
        int packetDrop;

        public props increment(String val) {
            if (val.contains("disconnected")) {
                clientDisconnected += 1;
            } else if (val.contains("connected")) {
                clientConnected += 1;
            } else if (val.contains("drop")) {
                packetDrop += 1;
            }

            return this;
        }
    }
}

【讨论】:

  • 根据 OP 处理的日志大小,int 可能不是计数器的最佳类型。为了完整起见,还可以在 Starter 类中添加一个文件阅读器。
  • 我同意你的看法。我们不能把它作为提问者的 TODO 吗?
猜你喜欢
  • 2019-10-27
  • 2022-10-13
  • 2014-09-28
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多