0

私自身の小さなプロジェクトのために、特定のアプリケーションからのイベント ログを解析するパーサーを作成しています。通常、このような処理にはほとんど問題はありませんが、問題は、これらのログの文字列が常に同じパラメーターを持っているとは限らないことです。たとえば、そのような文字列の 1 つとして次のようなものがあります。

DD/MM HH:MM:SS.MSEC TYPE_OF_EVENT SOURCE, SOURCE_FLAGS, TARGET, TARGET_FLAGS, PARAM1

別の場合、文字列には一連のパラメーターがあり、最大で 27 個、もう一方は 16 個です。ドキュメントを読むと、パラメーターにはいくつかのロジックがあります。たとえば、17 番目のパラメーターは常に保持されます。整数。それは良いことですが、残念ながら、17 番目のパラメーターは文字列の 7 番目のものである可能性があります。すべての文字列で実際に一定なのは、タイムスタンプと 6 番目の最初のパラメーターだけです。

このような文字列を解析するにはどうすればよいですか? 私の質問が少し不明確な場合は申し訳ありません。私の問題を言葉にするのは難しいと思います。

4

4 に答える 4

1

わかりました、上部にある私のコメントのフォローアップ。

ログのフォーマットが TYPE_OF_EVENT フィールドに基づいて「一定」である場合、簡単な事前解析を行うだけで済み、その後は簡単に実行できます。

  1. 一行読む
  2. 普遍的に共通のフィールドを抽出します: タイムスタンプ、イベントのタイプ、ソース/ターゲット
  3. type_of_event に基づいて、さらに分析を行う

    switch (event type) {
    case 'a': parse out 'a' event parameters
    case 'b': parse out 'b' event parameters
    default: log unknown event type for future analysis
    }

等々。

于 2011-02-16T16:18:56.317 に答える
1

注意すべき固定キーワードがないため、それ自体は「解析」できる入力ではありません。しかし、コンテンツを抽出して分割するには、正規表現で十分なようです。

http://regular-expressions.info/には良い紹介があり、https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-worldにはいくつかのリストがあります正規表現の設計に役立つクールなツール。

あなたの場合\d+、小数を一致させる必要があり、区切り文字を文字通り使用します。おそらく.*?,カンマ区切りで区切って個々の部分を見つけることができます。多分:

preg_match('#(\d+/\d+) (\d+:\d+:\d+.\d+) (\w+) (.*?),(.*),(.*),...#');

可変長の属性がある場合は、2 つの正規表現を優先する必要があります (ただし、1 つでも可能です)。最初.*に各行の残りを取得し、その後分割します。

于 2011-02-16T16:02:10.820 に答える
1

別のログ ソリューションを使用するか、空のプレースホルダー、item、item3、、、item6 などを持つように変更する方法を見つけます。

このアプリについてあまり詳しくない私の意見ですが、このアプリの音はあまり良くありません。私は通常、このような要因でアプリを判断します。ログ ファイルが標準化されていない正当な理由がない場合、残りのコードはどのように見えると思いますか? :)

于 2011-02-16T15:59:21.363 に答える
0

文字列を「、」セパレーターで分割し、すべてを配列に入れてみませんか。そうすれば、パラメーターが存在するかどうかを確認するための数値インデックスが得られます。

于 2011-02-16T15:59:29.080 に答える