• 使用 Java 解析 Apache 日志文件


    在这篇文章中,我们将研究如何在 Java 中解析 apache 日志文件。我们还将查看正则表达式的不同部分,这将帮助我们详细解析 apache 日志文件。

    文件格式是为人工检查而设计的,但不是为了便于解析。问题是在日志文件中使用了不同的分隔符——日期的方括号、请求行的引号贯穿始终的空格。如果您尝试使用 StringTokenizer,您也许可以让它工作,但您会花费大量时间来摆弄它。正则表达式将为您节省大量冗长的代码,让我们了解一下如何?

    示例 Apache 日志行如下所示:

    String ApacheLogSample = "123.45.67.89 - - [27/Oct/2000:09:27:09 -0400] \"GET /java/javaResources.html "+ "HTTP/1.0\" 200 10450 \"-\" \"Mozilla/4.6 [en] (X11; U; OpenBSD 2.8 i386; Nav)\"";
    

    下面是解析上述文件行的正则表达式:

    String regex = "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"(.+?)\"";

    • ([\d.]+)
      它表示数字后跟一个点 (.),例如 -> 123。
    • +
      它用于获取后跟点 (.) 的任意数量的数字,这将有助于获取日志文件中的 IP。
    • (\S+)
      这匹配任何不是空白字符的字符。
    • ([\w:/]+\s[+]\d4)" role="presentation" style="text-align: center; position: relative;">([\w:/]+\s[+]\d4)
      -> [w:/]

      这表示一个单词后跟一个冒号 (:) 或斜杠 (/)。它将涵盖ApacheLogSample字符串中的 27/Oct/2000:09:27:09,\s[+-]表示空格字符后跟加号(+)或减号(-),而 d{4} 正好代表四个重复数字。
    • (.+?)
      它用于获取引号之前的任何字符。我们不能(.+)在这里使用,因为那会匹配太多(直到行尾的引号)。
    • \d{3}
      它将精确匹配 3 个重复的数字,例如 123 甚至 1234,但不是 12。
    • (\d+)
      它将匹配任意数量的数字。
    • ([^”]+)
      它将匹配除双引号 ( ") 以外的任何字符。

    理解了上面的正则表达式之后,我们再来看看java中解析文件的程序。在这里,我们只使用双斜杠 (\\) 来转义字符。

    1. import java.util.regex.Matcher;
    2. import java.util.regex.Pattern;
    3. public class ApacheLogParser {
    4. public static void main(String argv[]) {
    5. String regex = "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"(.+?)\"";
    6. String ApacheLogSample = "123.45.67.89 - - [27/Oct/2000:09:27:09 -0400] \"GET /java/javaResources.html "
    7. + "HTTP/1.0\" 200 10450 \"-\" \"Mozilla/4.6 [en] (X11; U; OpenBSD 2.8 i386; Nav)\"";
    8. Pattern p = Pattern.compile(regex);
    9. System.out.println("Apache log input line: " + ApacheLogSample);
    10. Matcher matcher = p.matcher(ApacheLogSample);
    11. if (matcher.find()) {
    12. System.out.println("IP Address: " + matcher.group(1));
    13. System.out.println("UserName: " + matcher.group(3));
    14. System.out.println("Date/Time: " + matcher.group(4));
    15. System.out.println("Request: " + matcher.group(5));
    16. System.out.println("Response: " + matcher.group(6));
    17. System.out.println("Bytes Sent: " + matcher.group(7));
    18. if (!matcher.group(8).equals("-")) {
    19. System.out.println("Referer: " + matcher.group(8));
    20. }
    21. System.out.println("User-Agent: " + matcher.group(9));
    22. }
    23. }
    24. }

    程序的输出:

    1. Apache log input line: 123.45.67.89 - - [27/Oct/2000:09:27:09 -0400] "GET /java/javaResources.html HTTP/1.0" 200 10450 "-" "Mozilla/4.6 [en] (X11; U; OpenBSD 2.8 i386; Nav)"
    2. IP Address: 123.45.67.89
    3. UserName: -
    4. Date/Time: 27/Oct/2000:09:27:09 -0400
    5. Request: GET /java/javaResources.html HTTP/1.0
    6. Response: 200
    7. Bytes Sent: 10450
    8. User-Agent: Mozilla/4.6 [en] (X11; U; OpenBSD 2.8 i386; Nav)

    就是这样了。这就是使用 java 和 regex 解析 apache 日志文件所要做的全部工作。如果您想了解更多关于正则表达式的信息,那么您可以查看以下主题 -

  • 相关阅读:
    vector的动态分配内存实验
    #力扣:9. 回文数@FDDLC
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter1-初始 Linux Shell
    前端工程化-什么是构建工具
    数仓建模面试
    docker-consul的概述
    [附源码]计算机毕业设计JAVA花卉销售管理系统
    [HDLBits] Lfsr32
    基本的UDP套接字编程
    大模型自动优化 Prompt 的可行性分析
  • 原文地址:https://blog.csdn.net/allway2/article/details/126070624