0

我在 utils 文件夹中找到了 kannel 访问日志解析器 accesslog_parser.pl。如何使用此文件进行解析。

我也想将 kannel_access.log 转换为 csv 格式。请帮我。

4

2 回答 2

0

假设 Kannel 日志位于 /var/log/kannel/access.log

这应该做

cat /var/log/kannel/access.log |accesslog_parser.pl
于 2013-10-07T13:46:59.723 回答
0

可能是一个老问题,但我想分享这个用 java 编写的小工具,用于解析 kannel 日志文件并以 csv 格式输出结果:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.StringTokenizer;

/**
 *
 * @author bashizip
 */
public class KannelLogsParser {

    static String fileName;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {

        // fileName = args[0];
        fileName = "access_kannel.txt";
        String allLines = readLines(fileName);
        parseAndWriteToCsv(allLines);
    }

    static String readLines(String fileName) {

        BufferedReader br = null;
        String sCurrentLine = null;
        StringBuilder sb = new StringBuilder();
        try {
            br = new BufferedReader(
                    new FileReader(fileName));
            while ((sCurrentLine = br.readLine()) != null) {

                sb.append(sCurrentLine).append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return sb.toString();
    }

    private static void parseAndWriteToCsv(String allLines) throws IOException {

        String[] lines = allLines.split("\n");
        System.out.println("lines to parse : " + lines.length);
        StringTokenizer st;
        StringBuilder output = new StringBuilder();

        output.append("DATE;Heure;sent;SMS; SMSC; SVC; ACT; BINF; FID; from; to; flags; msg;;udh"+"\n");
        int count = 0;
        for (String line : lines) {
            count++;
            System.out.println("Parsing ..." + 100 * count / lines.length + "%");
            st = new StringTokenizer(line, " ");

            while (st.hasMoreTokens()) {

                String currentToken = st.nextToken();
                boolean messageToken = false;
                boolean afterMessageToken = false;

                if (currentToken.startsWith("[")) {

                    System.out.println(currentToken);
                    messageToken = currentToken.startsWith("[msg");

                    try {
                        currentToken = currentToken.substring(currentToken.indexOf(":") + 1, currentToken.indexOf("]"));
                    } catch (Exception e) {
                        System.err.println(e.getMessage());
                        messageToken = true;
                        currentToken = currentToken.substring(currentToken.indexOf(":") + 1);

                    }
                }

                currentToken = currentToken.replace("[", "");
                currentToken = currentToken.replace("]", "");

                output.append(currentToken);

                if (!messageToken) {
                    output.append(";");

                } else if (afterMessageToken) {
                    afterMessageToken = false;
                    output.append(" ");
                } else {
                    output.append(" ");
                    afterMessageToken = true;

                }
            }
                output.append("\n");
            }
            Files.write(Paths.get(fileName + ".csv"), output.toString().getBytes());
            System.out.println("Output CVS file: " + fileName + ".csv");
            System.out.println("Finished !");
        }
    }

希望有一天它可以帮助某人:-)

于 2019-03-01T00:29:04.827 回答