私は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)