0

サーバー アプリケーションからログ ファイルを「スクレイピング」するスクリプトを作成するために使用する言語を決定しようとしています。スクリプトの一般的なアルゴリズムは次のようになります (もちろん、細かい部分はすべてハッシュ化しています)。

1. Search for any line that contains (ACK_STRING, PARTIAL_FILL_STRING, or COMPLETE_FILL_STRING) and not AUTO_HEDGER_STRING
2. For each result
{
    Extract time, order ID, symbol, status, theo, price from line

    Get intermediate edge value
        If buy, edge = (theo - price)
        Else, edge = (price - theo)

    If order ID not found in order ID -> orderquoteinfo structure
    {
        Add (edge * qty of order) to total edge
    }

    Add edge to total edge received
        Add (edge * qty filled) to total edge received

    Store info in order ID -> orderquoteinfo structure
}

3.
For each order ID -> orderquoteinfo structure
{
    Print results in CSV format

    Time, Order ID, Symbol, Status, B/S, Qty, Price, Theo, Edge
}

4. Print total edge missed
    Print total edge - total edge received

5. Print total edge received

したがって、基本的には、C++ のマップや Perl の連想配列に似たデータ構造を使用して、ログ ファイルの各行から取得した情報を保持したいと考えています。私はシェルスクリプトに精通していませんが、ここでどの言語が意味を成すかを確認しようとしています. 私がログを取得しているサーバー アプリケーションは Linux サーバー上にあります (そして、すぐに別のプラットフォームに移植される可能性はほとんどありません)。したがって、Perl の移植性という要素は、私の頭の中には関係ありません。

私にとっては、シェル スクリプトよりも Perl スクリプトの作成に慣れているだけです。ただし、ここでシェルスクリプトを作成する方が理にかなっている場合は、シェルスクリプトを作成したいと思います。このスクリプトは、スケジュールされたタスクとして 1 日 1 回実行されます (ギブ オア テイク)。基本的に、スクリプトは、ログ ファイルからメトリック データを簡単に取得する方法として機能します。私が「スクレイピング」という用語を使用するのは、変更される可能性が最も低いが、そのリスクが残っているログ ファイル内の特定の文字列を検索するためです。

では、シェル スクリプトを作成するか、Perl を使用する必要がありますか? もっと理にかなっていることは何ですか?ここは関係ありますか?

4

3 に答える 3

3

パール


実際、私は「シェルか Perl か? 簡単に Ruby を使え」と言いたくなったので、このような主観的な質問はクローズされがちです。

でもどうしようもない原因がなんとなく気になるので真面目に答えてみます。確かに複雑なものはシェルコードとして書けますが、Perlのような本物の言語に比べると手間がかかりますし、結果も劣ります。

パールを使用。

于 2012-12-18T23:43:21.253 に答える
2

Perl は本当に必要なものです。結局のところ、PERL は「実用的な抽出およびレポート言語」を意味します。

ウィキペディアから : 「Perl は、1987 年に Larry Wall によって、レポートの処理を容易にするための汎用 Unix スクリプト言語として最初に開発されました。」したがって、この種のデータを処理することが Perl の最初の目標でした。そして、それは完璧です。

シェル スクリプトを使用すると、Perl や正規表現よりもログを処理するのが面倒になります。

于 2012-12-18T23:41:37.300 に答える
1

これは、Web サーバーのログをリアルタイムで監視するために使用するスクリプトの一部であり、必要なことを行うために簡単に書き直すことができると確信しています。File::Tailスクリプトから 1 つのログファイルのみを監視している場合は、より適切な選択になる可能性があることに注意してください。

このコードは、読み取りを 2 つの while ループにラップします。内側の while ループは各ファイルの新しい行をチェックし、外側の while ループは新しいファイルをチェックします。while (1) { }実際に移動する以外に、何か他のものを使用したい場合があります。

#!/usr/bin/perl
use warnings;
use strict;
use File::Tail::Multi;

while (1)
{
        my $reloadtime = time();

        my $file=File::Tail::Multi->new(
                Function        =>      \&parseline,
                LastRun_File    =>      '/var/autoblock.runtrack',
                Files           =>      ["/var/log/www/*/access.log"],
                RemoveDuplicate =>      0,
                NumLines        =>      0,
        );

        while (1)
        {
                $file->read;
                sleep 2;
        }
        sleep 2;
}

sub parseline()
{
        my $ref = shift;
        foreach ( @{$ref})
        {
         # Do stuff with each line here. The line is stored in $_
        }
}
于 2012-12-19T04:05:29.127 に答える