6

log4j, 10 回threadsのログへの書き込みで生成された長いログ ファイルがあります。ユーザーが長時間待機した行 (つまり、同じスレッドのログ エントリの差が 1 分以上ある行) を見つけることができるログ アナライザー ツールを探しています。

PS を使用しようとしてOtrosLogViewerいますが、特定の値 (スレッド ID など) によるフィルタリングが行われ、行間で比較されません。

OtrosLogViewer の新しいバージョンの PPS には、調整されたログ行の差 (ミリ秒) を計算する「デルタ」列があります。

ありがとうございました

4

3 に答える 3

3

この単純な Python スクリプトで十分かもしれません。テストのために、ローカルの Apache ログを分析しました。ところで、このログはCommon Log Formatを使用しているため、そのまま再利用することもできます。後続の 2 つのリクエストの差を単純に計算し、特定のしきい値 (私のテストでは 1 秒) を超えるデルタのリクエスト行を出力します。スレッド ID のパラメーターも受け入れる関数にコードをカプセル化して、さらにフィルター処理できるようにすることもできます。

#!/usr/bin/env python
import re
from datetime import datetime

THRESHOLD = 1

last = None
for line in open("/var/log/apache2/access.log"):
    # You may insert here something like
    # if not re.match(THREAD_ID, line):
    #   continue
    # Python does not support %z, hence the [:-6]
    current = datetime.strptime(
        re.search(r"\[([^]]+)]", line).group(1)[:-6],
        "%d/%b/%Y:%H:%M:%S")
    if last != None and (current - last).seconds > THRESHOLD:
        print re.search('"([^"]+)"', line).group(1)
    last = current
于 2012-09-07T21:18:03.753 に答える
2

@Raffaeleの回答に基づいて、任意のログファイルで機能するようにいくつかの修正を行いました(Jenkinsコンソールログなど、要求された日付で始まらない行をスキップします)。さらに、最大/最小しきい値を追加して、期間制限に基づいて行を除外します。

#!/usr/bin/env python
import re
from datetime import datetime

MIN_THRESHOLD = 80
MAX_THRESHOLD = 100

regCompile = r"\w+\s+(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d).*"
filePath = "C:/Users/user/Desktop/temp/jenkins.log"

lastTime = None
lastLine = ""

with open(filePath, 'r') as f:
    for line in f:   
        regexp = re.search(regCompile, line)
        if regexp:
            currentTime = datetime.strptime(re.search(regCompile, line).group(1), "%Y-%m-%d %H:%M:%S")

            if lastTime != None:
                duration = (currentTime - lastTime).seconds
                if duration >= MIN_THRESHOLD and duration <= MAX_THRESHOLD:
                    print ("#######################################################################################################################################")
                    print (lastLine)
                    print (line)
            lastTime = currentTime
            lastLine = line
f.closed
于 2016-05-01T11:07:14.893 に答える