2017-09-30 9 views
0

ヘルプが必要ですが、私はこの正規表現を通してApacheのログファイルを渡す必要がありますが、動作していない場合はfalseを返します。Regexがログファイルの各行にApacheを渡す

private String accessLogRegex() 
{ 
    String regex1 = "^([\\d.]+)"; // Client IP 
    String regex2 = " (\\S+)"; // - 
    String regex3 = " (\\S+)"; // - 
    String regex4 = " \\[([\\w:/]+\\s[+\\-]\\d{4})\\]"; // Date 
    String regex5 = " \"(.+?)\""; // request method and url 
    String regex6 = " (\\d{3})"; // HTTP code 
    String regex7 = " (\\d+|(.+?))"; // Number of bytes 
    String regex8 = " \"([^\"]+|(.+?))\""; // Referer 
    String regex9 = " \"([^\"]+|(.+?))\""; // Agent 

    return regex1+regex2+regex3+regex4+regex5+regex6+regex7+regex8+regex9; 
} 

Pattern accessLogPattern = Pattern.compile(accessLogRegex()); 
Matcher entryMatcher; 
String log = "64.242.88.10 | 2004-07-25.16:36:22 | "GET /twiki/bin/rdiff/Main/ConfigurationVariables HTTP/1.1" 401 1284 | Mozilla/4.6 [en] (X11; U; OpenBSD 2.8 i386; Nav)"; 

entryMatcher = accessLogPattern.matcher(log); 
if(!entryMatcher.matches()){ 
    System.out.println("" + index +" : couldn't be parsed"); 
} 

私はApacheログのサンプルを含めましたが、pip( "|")で区切られています。

答えて

0

regexesを使用する理由はありますか?これらは、誤解しやすい、非常にエラーが発生しやすいですし、メンテナンスの悪夢ことができます...

代替はこのためのライブラリを使用するかもしれないが、例えばthis one

あなたが望むならば、言ったこと正規表現を使用するために、あなたは、エラーの数が含まれています:あなたはを与えている

String regex1 = "^([\\d.]+)"; // while quite liberal, this should work 
String regex2 = " (\\S+)"; // matches the first pipe 
String regex3 = " (\\S+)"; // this will match the date field 
String regex4 = " \\[([\\w:/]+\\s[+\\-]\\d{4})\\]"; // date has already been matched so this won't work, also this is all wrong 
String regex5 = " \"(.+?)\""; // you're not matching the pipe character before the URL; also, why the ? 
String regex6 = " (\\d{3})"; // HTTP code 
String regex7 = " (\\d+|(.+?))"; // Why are you also matching any other characters than just digits? 
String regex8 = " \"([^\"]+|(.+?))\""; // Your sample log line doesn't contain a referer 
String regex9 = " \"([^\"]+|(.+?))\""; // Agent is not enclosed in quotes 

一つの可能​​な正規表現の例のためのソリューションログ行はこれです:

String regex1 = "^([\\d.]+)"; // digits and dots: the IP 
String regex2 = " \\|"; // why match any character if you *know* there is a pipe? 
String regex3 = " ((?:\\d+[-:.])+\\d+)"; // match the date; don't capture the inner group as we are only interested in the full date 
String regex4 = " \\|"; // pipe 
String regex5 = " \"(.+)\""; // request method and url 
String regex6 = " (\\d{3})"; // HTTP code 
String regex7 = " (\\d+)"; // Number of bytes 
String regex8 = " \\|"; // pipe again 
String regex9 = " (.+)"; // The rest of the line is the user agent 

他のログ行がまったく同じ形式に従わない場合は、これをさらに調整する必要があります。

+0

ありがとう@ brain99、パーサーのlibを使用して、私はyyyy-MM-dd.HH:mm:ss形式の '%{format} t'string形式で時刻を渡そうとしています。 –

+0

もし私がリンクしているライブラリを使っているのであれば、ログフォーマットを正しく設定するだけです( '' logformat = "%h |%{%Y-%m-%d。%H:%M:%あなたは、日付をタイムスタンプとして取得するか、POJO内の個々のフィールドを持つかを選択することができます(年、月、day、...) – brain99

+0

うわー、あなたは最高です... pipで区切られた任意のapacheログファイルに対して上記のlogformatの作業ができます。ありがとう –

関連する問題