3

目立つステートメントのためにWebアプリケーションのログファイルを調べています。

ほとんどの線は似ていて面白くありません。私はそれらをUnixuniqに渡しますが、すべての行がわずかに異なるため、何もフィルタリングしません。それらはすべて異なるタイムスタンプを持ち、同様のステートメントは異なるユーザーIDを出力する可能性があります。

他とは著しく異なる線だけを取得する方法やツールは何ですか?(しかし、繰り返しますが、正確な複製ではありません)

私はPythonのdifflibで遊ぶことを考えていましたが、それは同じファイル内のすべての行のペアではなく、2つのファイルを比較することを目的としているようです。

[編集]

私は、このソリューションが各行の一意性スコアを与えると想定しました。つまり、「著しく異なる」とは、出力に含まれる行に対して一意性スコアが超えなければならないしきい値を選択することを意味します。

それに基づいて、それを定義する他の実行可能な方法がある場合は、話し合ってください。また、メソッドは100%の精度と再現率を持っている必要はありません。

[/編集]

例:

できるだけ汎用的な回答を希望します。最初にタイムスタンプを削除できることはわかっています。その言語はファイル内の他のものとはまったく異なる可能性があるため、末尾を削除することはより困難です。このような詳細は、私が以前に具体的な例を避けた理由ですが、一部の人々が尋ねたので...

同様の1:

2009-04-20 00:03:57 INFO  com.foo.Bar - URL:/graph?id=1234
2009-04-20 00:04:02 INFO  com.foo.Bar - URL:/graph?id=asdfghjk

同様の2:

2009-04-20 00:05:59 INFO  com.baz.abc.Accessor - Cache /path/to/some/dir hits: 3466 / 16534, 0.102818% misses
2009-04-20 00:06:00 INFO  com.baz.abc.Accessor - Cache /path/to/some/different/dir hits: 4352685 / 271315, 0.004423% misses

異なる1:

2009-04-20 00:03:57 INFO  com.foo.Bar - URL:/graph?id=1234
2009-04-20 00:05:59 INFO  com.baz.abc.Accessor - Cache /path/to/some/dir hits: 3466 / 16534, 0.102818% misses

別の1のケースでは、両方の行を返したいのですが、それらのような他の行は返したくありません。つまり、これらの2つの線は別個のタイプです(後で、統計的にまれな線タイプのみを要求できます)。一つには、編集距離はこれら2つの間ではるかに大きくなります。

4

6 に答える 6

3

「著しく異なる」を定義します。次に、「距離の編集」メジャーを見てください。

于 2009-04-20T19:35:08.927 に答える
2

単語を数えるコードを少し試してから、最も一般的でない単語で行を並べ替えることができます。

それでもうまくいかない場合は、いくつかのスマートを追加して、タイムスタンプと数字を除外できます。

あなたの問題は、ニュース記事の要約を生成することに関する以前の質問に似ています。

于 2009-04-20T19:35:15.900 に答える
2

私はあなたのためのツールを知りませんが、が自分自身を転がすつもりなら、私は次のようにそれにアプローチします:

おそらく、ログ行は明確に定義された構造を持っていますね?それで

  • その構造の行を解析します
  • いくつかの非常に基本的な関連性フィルター(解析された構造から単純な数値を返す関数)を記述します。
  • 解析された行を一連のフィルターに通し、合計スコアに基づいてカットします
  • より多くのフィルターの結果によって、残りの行をさまざまなビンにソートする可能性があります
  • レポートの生成、ビンのファイルへのダンプ、またはその他の出力

UNIXツールに精通している場合はprocmail、データ用にカスタマイズされた同様の処理をお勧めします。


コメントのメモをzacheratesするように、フィルターは通常、タイムスタンプ(および場合によってはIPアドレス)を無視し、コンテンツに集中します。たとえば、非常に長いhttpリクエストは、攻撃を表す可能性があります...またはドメインに適用されるものは何でも。

ビニングフィルターは、選択したいくつかのフィールドのハッシュのように単純な場合もあれば、チャーリーマーティンの提案と使用した編集距離の測定値を使用して何かをしようとする場合もあります。

于 2009-04-20T19:37:47.420 に答える
1

おそらく、「同じ単語」/「すべての単語」の基本的な計算を行うことができますか?

例 (タイムスタンプと「INFO」という単語が常に同じである場合に無視できるようにするためのオフセットを含む):

def score(s1, s2, offset=26):
    words1 = re.findall('\w+', s1[offset:])
    words2 = re.findall('\w+', s2[offset:])
    return float(len(set(words1) & set(words2)))/max(len(set(words1)), len(set(words2)))

与えられた:

>>> s1
'2009-04-20 00:03:57 INFO  com.foo.Bar - URL:/graph?id=1234'
>>> s2
'2009-04-20 00:04:02 INFO  com.foo.Bar - URL:/graph?id=asdfghjk'
>>> s3
'2009-04-20 00:05:59 INFO  com.baz.abc.Accessor - Cache /path/to/some/dir hits: 3466 / 16534, 0.102818% misses'
>>> s4
'2009-04-20 00:06:00 INFO  com.baz.abc.Accessor - Cache /path/to/some/different/dir hits: 4352685 / 271315, 0.004423% misses'

これにより、次の結果が得られます。

>>> score(s1,s2)
0.8571428571428571
>>> score(s3,s4)
0.75
>>> score(s1,s3)
0.066666666666666666

比較する行を決定する必要があります。また、 set() を使用すると、スコアがわずかに歪む可能性があります – 単純なアルゴリズムの代償:-)

于 2009-04-21T02:21:56.390 に答える
0

あなたにとっての独自性を定義する部分に焦点を当てていただけないでしょうか。この場合、一意性を定義する部分はちょうど中間部分にあるようです:

2009-04-20 00:03:57 INFO com.foo.Bar - URL:/graph?id=1234
                    ^---------------------^

2009-04-20 00:05:59 INFO com.baz.abc.Accessor - キャッシュ /path/to/some/dir ヒット: 3466 / 16534、0.102818% ミス
                    ^--------------------------------^

次に、おそらく正規表現を使用して、この部分を正確に比較します (括弧で囲まれたグループのみ。このようなサブマッチにアクセスする方法は言語によって異なります)。

/^.{20}(\w+\s+[\w\.-]+\s+-\s+\w+)/
于 2009-04-21T00:26:14.450 に答える
0

これをフィールドに分割し、「重大度レベル」フィールドと次のフィールド (「クラス」のように見えます) で並べ替えたいと思います。Haskellを使用します:

モジュールのメイン
import Data.List (nubBy、sortBy)

sortAndNub s = nubBy fields2and3
     $ sortBy fields2and3comp
     $ 地図の単語 $ 行 s

fields2and3 ab = fieldEq 2 ab
                  && fieldEq 3 ab
fieldEq fab = a!!f == (b!!f)
fields2and3comp ab = ケース比較 (a!!2) (b!!2) の
   LT -> LT
   GT -> GT
   EQ -> 比較 (a!!3) (b!!3)
main = interact $ unlines.(map unwords).sortAndNub
于 2009-04-21T01:16:32.490 に答える