在这篇文章中,我们将研究如何在 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.]+)(.+)在这里使用,因为那会匹配太多(直到行尾的引号)。") 以外的任何字符。理解了上面的正则表达式之后,我们再来看看java中解析文件的程序。在这里,我们只使用双斜杠 (\\) 来转义字符。
-
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
-
- public class ApacheLogParser {
-
- public static void main(String argv[]) {
- String regex = "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"(.+?)\"";
- 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)\"";
-
- Pattern p = Pattern.compile(regex);
- System.out.println("Apache log input line: " + ApacheLogSample);
- Matcher matcher = p.matcher(ApacheLogSample);
- if (matcher.find()) {
- System.out.println("IP Address: " + matcher.group(1));
- System.out.println("UserName: " + matcher.group(3));
- System.out.println("Date/Time: " + matcher.group(4));
- System.out.println("Request: " + matcher.group(5));
- System.out.println("Response: " + matcher.group(6));
- System.out.println("Bytes Sent: " + matcher.group(7));
- if (!matcher.group(8).equals("-")) {
- System.out.println("Referer: " + matcher.group(8));
- }
- System.out.println("User-Agent: " + matcher.group(9));
- }
-
- }
- }
程序的输出:
- 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)"
- IP Address: 123.45.67.89
- UserName: -
- Date/Time: 27/Oct/2000:09:27:09 -0400
- Request: GET /java/javaResources.html HTTP/1.0
- Response: 200
- Bytes Sent: 10450
- User-Agent: Mozilla/4.6 [en] (X11; U; OpenBSD 2.8 i386; Nav)
就是这样了。这就是使用 java 和 regex 解析 apache 日志文件所要做的全部工作。如果您想了解更多关于正则表达式的信息,那么您可以查看以下主题 -