3

行ごとに一貫性のないテキスト ファイルにログ ファイルを生成するプロキシ アプリがあります。行が何を報告しているかに応じて、一部のデータが存在するか、または欠落しています。次に例を示します。

2012-08-05 10:48:59 Login.Failure   [ip address]    12312191391921
2012-08-05 10:49:05 Login.Success   [ip address]    19919292912912  IQi8CaVGiXoPXGy
2012-08-05 12:50:57 Logout      19919292912912  IQi8CaVGiXoPXGy Expired

可能な値は 7 つありますが、ご覧のとおり、すべての値が常に存在するわけではありません。

これらの値をデータベースに入力して、統計を作成したいと考えています。これまでのところ、位置 2 (0,1,2) の配列を調べる必要があると推測しています。特定の文字列と一致する場合は、これらの項目のみ存在すると予想し、別の文字列と一致する場合は、これらの項目のみを予想します。など

これまでの私の考えは、配列を中断し、見つかった値に応じて新しい条件を追加するところまで来ました。それはうまくいかないことはわかっていますが、これは私が考えた限りです:

$output = explode("\n", $output);
foreach($output as $var) {
$tmp = explode(" ", $var);
$dateentered = $tmp[0];
$timeentered = $tmp[1];
$event = $tmp[3];

if  $tmp[3]="Login.Failure" then

$IP = $tmp[4];
$username = $tmp[5];

$connection = mysql_connect("localhost", "user", "pass") or die('unable to connect');

mysql_select_db('dbname') or die('unable to select database');

$sql = "INSERT INTO table SET dateentered='$dateentered', timeentered='$timeentered', event='$event', IP ='$IP ', username='$username'";

$result=mysql_query($sql,$connection) or die('Error in query: $query. ' .mysql_error());


else if $tmp[3]="Login.Success" then

$IP = $tmp[4];
$username = $tmp[5];
$session = $tmp[6];

...等々...

私はすべての成功を引き出してそれらを合計し、失敗についても同じことができるようにしたいと考えています。

これにどのようにアプローチしますか?誰かが賢明なワークフローのアイデアを持っているだけでも、そこから構築できます。私は明らかに初心者ですが、ベルトの下にいくつかのページがあります。

すべての返信に感謝します。

4

3 に答える 3

1

データベース構造が次のようにならないのはなぜですか:

2012-08-05 10:48:59 Login.Failure   [ip address]    12312191391921  NULL            NULL
2012-08-05 10:49:05 Login.Success   [ip address]    19919292912912  IQi8CaVGiXoPXGy NULL
2012-08-05 12:50:57 Logout          NULL            19919292912912  IQi8CaVGiXoPXGy Expired

またはこのように:

2012-08-05 10:48:59 Login.Failure   [ip address]    12312191391921  ""              ""
2012-08-05 10:49:05 Login.Success   [ip address]    19919292912912  IQi8CaVGiXoPXGy ""
2012-08-05 12:50:57 Logout          ""              19919292912912  IQi8CaVGiXoPXGy Expired

正しい列に正しいデータを維持すること、または同じ列に関連データを維持することを優先する必要があります。

あなたのコードに対処するために、私はこの解決策がうまくいくと信じています:

$output;                            // data gotten from file
$connection = mysql_connect("localhost", "user", "pass") 
  or die('unable to connect');      // connect to DB
mysql_select_db('dbname')           // select DB
  or die('unable to select database');
$output = explode("\n", $output);   // tokenize input by lines
for($i=0; $i<count($output); $i++) {// for each line
  $tmp = explode(" ", $output[i]);  // tokenize lines by spaces
  $dateentered = $tmp[0];           // set required data
  $timeentered = $tmp[1];           // set required data
  $event    = $tmp[3];              //i think this should be [2]
  $IP       = "";                   // set default value of possible data
  $username = "";                   // set default value of possible data
  $session  = "";                   // set default value of possible data
  $expired  = "";                   // set default value of possible data

       if ($event=="Login.Failure") { 
    $IP       = $tmp[4];            //i think this should be [3]
    $username = $tmp[5];            //i think this should be [4]
  } 
  else if ($event=="Login.Success") {
    $IP       = $tmp[4];            //i think this should be [3]
    $username = $tmp[5];            //i think this should be [4]
    $session  = $tmp[6];            //i think this should be [5]
  }
  else if ($event=="Logout") {
    $username = $tmp[5];            //i think this should be [4]
    $session  = $tmp[6];            //i think this should be [5]
    $expired  = $tmp[7];            //i think this should be [6]
  }
/*
 * Update DB:
 */
  $sql = "INSERT INTO table SET "
        ."dateentered='$dateentered', "
        ."timeentered='$timeentered', "
        ."event='$event', "
        ."IP ='$IP', " 
        ."username='$username', "
        ."session='$session', "
        ."expired='$expired'";
  $result=mysql_query($sql,$connection) 
    or die('Error in query: $query. ' .mysql_error() 
          .'\n\nWhile Processing line $i');
}                                   // closing brace of for loop
mysql_close($connection);           // close connection to DB

コードに関する質問:

  • どこに/何があり$tmp[2]ます; インデックスが 1 ずれている可能性があると思います

また、コードを確認して、データベースに盲目的にプラグインするために必要なように動作することを確認してください。私はあなたの問題を正しく解釈し、実用的な解決策を提示したと思いますが、確信できるのはあなただけです。

于 2012-08-07T22:53:24.227 に答える
0

キーがログ エントリ タイプ ( 、 など) で、値がエントリの配列である連想配列を作成できLogin.SuccessますLogin.Failure

次に、最初のキーで配列をループします。各ログ タイプに期待されるフィールドがわかっているため。これは、テンプレート SQL クエリを作成する単純なケースです (もちろん、適切なエスケープを使用します)。

于 2012-08-07T22:48:45.453 に答える