0

私はpythonが初めてです。特定の文字列ログファイルを見つけて、その行から特定の情報を抽出するために、すばやく汚い python スクリプトを作成しようとしています。ログファイルの行は次のようになります

2012-08-01 13:36:40,449 [PDispatcher: ] ERROR  Fatal error DEF_CON encountered. Shutting down
2012-08-01 14:17:10,749 [PDispatcher: ] INFO  Package 1900034442 Queued for clearance.
2012-08-01 14:23:06,998 [PDispatcher: ] ERROR Exception occurred attempting to lookup prod id 90000142

入力パラメーターがファイル名と検索するパターンの配列になる関数があります。現在、指定されたパターンを 1 つ以上含むファイル内のすべての行を見つけることができ (最も効率的な方法かどうかはわかりません)、行番号と行を抽出することができます。

def searchLogs(fn, searchPatterns):
    res = []
    with open(fn) as f:
        for lineNo, line in enumerate(f, 1):
            #check if pattern strings exist in line
            for sPattern in searchPatterns:
                if sPattern in line:
                    fountItem = [fn, pattern, lineNo, line]
                    res.append(fountItem)
    return res

searchLogs("c:\temp\app.log", ["ERROR", "DEF_CON"]) #this should return 3 elements based on the above log snipped (2 for the first line and 1 for the third line)

私がやりたいことは、検索中に日付と時刻を抽出することです。したがって、検索パターンを、日付を検索して抽出するグループ化された正規表現文字列に変更することを考えていました。1つだけ問題があります.Pythonでこれを行う方法がわかりません...どんな助けもいただければ幸いです。

編集(解決策):セバスチャンとジョエルが提供したリンクの助けを借りて、私はこの解決策を思いつきました:

def search_logs(fn, searchPatterns):
    res = []
    with open(fn) as f:
        for lineNo, line in enumerate(f, 1):
            #check if pattern strings exist in line
            for sPattern in searchPatterns:
                #crude reg ex to match pattern and if matched, 'group' timestamp
                rex = r'^(.+) \[.*' + pattern 
                ms = re.match(rex, line)
                if ms:
                    time = ms.group(1)
                    item = Structs.MatchedItem(fn, pattern, lineNo, line, time)
                    res.append(item)
    return res

search_logs("c:\temp\app.log", ["ERROR", "DEF_CON"]) #this should return 3 elements based on the above log snipped (2 for the first line and 1 for the third line)
4

2 に答える 2

1

これが正規表現です。正規表現はテストしましたが、完全なコードはテストしていません

def searchLogs(fn, searchPatterns):
    res = []
    with open(fn) as f:
        for lineNo, line in enumerate(f, 1):
            #check if pattern strings exist in line
            for sPattern in searchPatterns:
                if sPattern in line:
                    date = re.search(r'(19|20)\d{2}-(0[1-9]|[12])-(0[1-9]|[12][0-9]|3[01])',line).group()
                    time = re.search(r'\b([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]),[0-9][0-9][0-9]',line).group()
                    fountItem = (fn, pattern, lineNo, date, time, line) # prefer a tuple over list
                    res.append(fountItem)
    return res

PS : RE は常に、間違った場所で苦労します。説明が必要な場合はお知らせください。:)

于 2012-08-02T04:57:06.073 に答える
1

次の 2 つの部分があります。

  • 日時文字列を抽出する
  • それを日時オブジェクトに解析します

datetime.strptime()後でfunctionを使用できます:

try:
    dt = datetime.strptime(line.split(" [", 1)[0], "%Y-%m-%d %H:%M:%S,%f")
except ValueError:
    dt = None

line.split(" [", 1)[0]前者は、ログ ファイルの規則性と、ソリューションの高速性と堅牢性(高速だが壊れやすいなど)によって異なります。より堅牢なソリューションは次のとおりです。

' '.join(line.split(None, 2)[:2])

しかし、それは遅くなるかもしれません。

于 2012-08-02T04:05:35.437 に答える