kube 小工具 java log

发布时间 2023-08-03 19:51:50作者: zno2

 

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class log {

    public static void main(String[] args) throws IOException {

        String namespace = null;
        String appname = null;
        
        if(args.length > 0) {
            namespace = args[0];
        }
        if(args.length > 1) {
            appname = args[1];
        }
        
        
        String out = kubectlgetpods(namespace);

        List<String> lines = toLines(out);
        StringBuffer sb = new StringBuffer();
        for (String line : lines) {
            sb.append(line).append("\r\n");
        }

        if(namespace == null) {
            return;
        }
        
        List<Map<String, String>> table = table(sb.toString(),
                new String[] { "NAME", "READY", "STATUS", "RESTARTS", "AGE"},
                new String[] { "LEFT", "LEFT", "LEFT", "LEFT", "LEFT"});

        String name = null;
        for (Map<String, String> map : table) {
            if(appname != null && map.get("NAME").contains(appname)) {
                name = map.get("NAME");
                 kubectllogs(namespace,name);
            }
        }

       


    }

    public static void kubectllogs(String namespace, String name) throws IOException {
//        Runtime runtime = Runtime.getRuntime();
        String command = "kubectl -n "+namespace+" logs -f " + name + " --since=10m";
        System.out.println(command);
//        Process process = runtime.exec(command);
//        String result = toStr(process.getInputStream());
//        process.destroy();
//        return result;
    }
    
    public static String kubectlgetpods(String namespace) throws IOException {
        Runtime runtime = Runtime.getRuntime();
        String cmd = "kubectl get namespaces";
        if(namespace != null) {
            cmd = "kubectl -n "+namespace+" get pods";
        }
        Process process = runtime.exec(cmd);
        String result = toStr(process.getInputStream());
        process.destroy();
        System.out.println(result);
        return result;
    }

    /**
     * 将流转为文本
     * @param in
     * @return
     * @throws IOException
     */
    public static String toStr(InputStream in) throws IOException {
        BufferedInputStream b = new BufferedInputStream(in);
        byte[] buffer = new byte[1024];
        int l = 0;
        StringBuffer sb = new StringBuffer();
        while ((l = b.read(buffer)) != -1) {
            sb.append(new String(buffer, 0, l));
        }
        return sb.toString();
    }
    
    /**
     * 将shell命令输出的文本转换为表格 
     * @param text    shell output
     * @param columns
     * @param aligns   LEFT or RIGHT
     * @return
     * @throws IOException
     */
    public static List<Map<String, String>> table(String text, String[] columns, String[] aligns) throws IOException {

        // 不提供默认左对齐 
        if (aligns == null) {
            aligns = new String[columns.length];
            for (int i = 0; i < aligns.length; i++) {
                aligns[i] = "LEFT";
            }
        }

        List<String> lines = toLines(text);
        List<Integer> verticalLineList = new ArrayList<Integer>();

        String titleLine = lines.get(0);

        for (int i = 0; i < columns.length - 1; i++) {
            String columnA = columns[i];
            String columnB = columns[i + 1];
            int boardLeft = 0;
            int boardRigth = 0;
            if (titleLine.indexOf(" " + columnA + " ") > -1) {
                boardLeft = titleLine.indexOf(" " + columnA + " ") + 1;
            } else if (titleLine.indexOf(columnA + " ") > -1) {
                boardLeft = titleLine.indexOf(columnA + " ");
            } else {
                boardLeft = titleLine.indexOf(columnA);
            }
            if (titleLine.indexOf(" " + columnB + " ") > -1) {
                boardRigth = titleLine.indexOf(" " + columnB + " ") + columnB.length() + 1;
            } else if (titleLine.indexOf(" " + columnB) > -1) {
                boardRigth = titleLine.indexOf(" " + columnB) + columnB.length() + 1;
            } else {
                boardRigth = titleLine.indexOf(columnB) + columnB.length();
            }

            Integer verticalLine = null;
            if ("LEFT".equals(aligns[i]) && "RIGHT".equals(aligns[i + 1])) {
                Pattern p = Pattern.compile("[^  \r\r\n]+");
                verticalLine = boardLeft + columnA.length();

                for (String line : lines) {
                    String frag = line.substring(boardLeft, boardRigth);
                    Matcher matcher = p.matcher(frag);
                    matcher.find();
                    String group = matcher.group();
                    if (boardLeft + group.length() > verticalLine) {
                        verticalLine = boardLeft + group.length();
                    }
                }
            } else if ("LEFT".equals(aligns[i]) && "LEFT".equals(aligns[i + 1])) {
                verticalLine = boardRigth - columnB.length();
            } else if ("RIGHT".equals(aligns[i]) && "RIGHT".equals(aligns[i + 1])) {
                verticalLine = boardLeft + columnA.length();
            } else if ("RIGHT".equals(aligns[i]) && "LEFT".equals(aligns[i + 1])) {
                verticalLine = boardLeft + columnA.length();
            }
            verticalLineList.add(verticalLine);
        }

        List<Map<String, String>> table = new ArrayList<>();
        for (String line : lines) {
            Map<String, String> item = new LinkedHashMap<>();
            int size = verticalLineList.size();
            for (int i = 0; i < size; i++) {
                Integer right = verticalLineList.get(i);
                Integer left = 0;
                if (i > 0) {
                    left = verticalLineList.get(i - 1);
                }
                item.put(columns[i], line.substring(left, right).trim());
            }
            item.put(columns[size], line.substring(verticalLineList.get(size - 1)));
            table.add(item);
        }

        return table;
    }
    
    /**
     * 将文本转为行列表 
     * @param text
     * @return
     * @throws IOException
     */
    public static List<String> toLines(String text) throws IOException{
        List<String> lines = new ArrayList<String>();
        BufferedReader br = new BufferedReader(new StringReader(text));
        String l;
        while((l=br.readLine()) != null) {
            lines.add(l);
        }
        return lines;
    }
}

 

示例:

java log

[qishi@xs-srv-dev-01 ~]$ java log
NAME                              STATUS   AGE
apollo                            Active   90d
apollo-block                      Active   9d
default                           Active   108d
dev-xxxxx                         Active   108d
dev-qishi-12328                   Active   90d
fat-xxxxx                         Active   108d
fat-xxxxx-12328                   Active   90d
kube-node-lease                   Active   108d
kube-public                       Active   108d
kube-system                       Active   108d
kubekey-system                    Active   108d
kubesphere-controls-system        Active   108d
kubesphere-monitoring-federated   Active   108d
kubesphere-monitoring-system      Active   108d
kubesphere-system                 Active   108d
uat-xxxxx                         Active   108d

 

java log apollo

NAME                                                      READY   STATUS    RESTARTS   AGE
apollo-portal-5f75d7c7f5-qckqr                            1/1     Running   0          31d
apollo-service-fat-apollo-adminservice-6f4f98d688-vzbhx   1/1     Running   0          31d
apollo-service-fat-apollo-configservice-6fc8d478d-ngg9r   1/1     Running   0          31d

 

java log apollo portal

NAME                                                      READY   STATUS    RESTARTS   AGE
apollo-portal-5f75d7c7f5-qckqr                            1/1     Running   0          31d
apollo-service-fat-apollo-adminservice-6f4f98d688-vzbhx   1/1     Running   0          31d
apollo-service-fat-apollo-configservice-6fc8d478d-ngg9r   1/1     Running   0          31d

kubectl -n apollo logs -f apollo-portal-5f75d7c7f5-qckqr --since=10m