0

前述のようにログを生成するマルチスレッド アプリケーションがあります。

    D Fri Feb 01 00:21:23 2013  <no machine>  pin_deferred_act:10233  pin_mta_conf.c:636 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:0:1359658283:1
            pin_mta_convert_cmdline_options_to_flist parameters flist

    D Fri Feb 01 00:21:23 2013  App-BRM-Prod-Pri.acttv.in  pin_deferred_act:10233  pcpst.c(78):406 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:2:0:1359658283:0
            connect to host=172.16.87.14, port=11962 OK
    D Fri Feb 01 00:21:24 2013  App-BRM-Prod-Pri.acttv.in  pin_deferred_act:10233  pin_mta.c:2479 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:0:1359658283:0
            Config object search input flist
    0 PIN_FLD_POID           POID [0] 0.0.0.1 /search/pin -1 0
    0 PIN_FLD_FLAGS           INT [0] 0
    0 PIN_FLD_TEMPLATE        STR [0] "select X from /config/mta where F1 = V1 "
    0 PIN_FLD_ARGS          ARRAY [1] allocated 20, used 1
    1     PIN_FLD_CONFIG_MTA    ARRAY [0] allocated 20, used 1
    2         PIN_FLD_NAME            STR [0] "pin_deferred_act"
    0 PIN_FLD_RESULTS       ARRAY [0] allocated 20, used 1
    1     PIN_FLD_POID           POID [0] NULL poid pointer
    D Fri Feb 01 00:21:24 2013  App-BRM-Prod-Pri.acttv.in  pin_deferred_act:10233  pin_mta.c:2484 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:3:7:1359658284:2
            Config object search output flist
    0 PIN_FLD_POID           POID [0] 0.0.0.1 /search/pin -1 0
    D Fri Feb 01 00:21:24 2013  App-BRM-Prod-Pri.acttv.in  pin_deferred_act:10233  pin_mta.c:3138 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:7:1359658284:2

したがって、スレッドはpin_deferred_act:10233:1:7のようにログを更新します --> ここで、1 はログファイル内の最初のスレッドからのログを指定します。

スレッドごとにログファイルを作成したいのですが、開始点は次のとおりです。

1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:

エンドポイントは次のようになります。

D Fri Feb 01 00:21:24 2013  App-BRM-Prod-Pri.acttv.in 

(日付/タイムスタンプが変更され続ける場所)。すべてのインスタンスを 1 つのファイルに入れる必要があります。

例:

    D Fri Feb 01 00:21:23 2013  <no machine>  pin_deferred_act:10233  pin_mta_conf.c:636 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:0:1359658283:1
            pin_mta_convert_cmdline_options_to_flist parameters flist
    D Fri Feb 01 00:21:23 2013  App-BRM-Prod-Pri.acttv.in  pin_deferred_act:10233  pcpst.c(78):406 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:2:0:1359658283:0
            connect to host=172.16.87.14, port=11962 OK
    D Fri Feb 01 00:21:24 2013  App-BRM-Prod-Pri.acttv.in  pin_deferred_act:10233  pin_mta.c:2479 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:0:1359658283:0
            Config object search input flist
    0 PIN_FLD_POID           POID [0] 0.0.0.1 /search/pin -1 0
    0 PIN_FLD_FLAGS           INT [0] 0
    0 PIN_FLD_TEMPLATE        STR [0] "select X from /config/mta where F1 = V1 "
    0 PIN_FLD_ARGS          ARRAY [1] allocated 20, used 1
    1     PIN_FLD_CONFIG_MTA    ARRAY [0] allocated 20, used 1
    2         PIN_FLD_NAME            STR [0] "pin_deferred_act"
    0 PIN_FLD_RESULTS       ARRAY [0] allocated 20, used 1
    1     PIN_FLD_POID           POID [0] NULL poid pointer
    D Fri Feb 01 00:21:24 2013  App-BRM-Prod-Pri.acttv.in  pin_deferred_act:10233  pin_mta.c:3138 1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:7:1359658284:2

1 つのファイル ( Thread1.log ) に移動する必要があります。他のスレッドについても同様に、ファイルはThreadn.logとしてそれぞれ作成する必要があります。

4

2 に答える 2

1

ファイルは、そもそもログを処理するための面倒でスケーラブルでない方法です。より良いアプローチは、ソース -> シンクに接続されたログ エントリ メッセージのストリームとしてログを処理することです。Oracle がデータ収集の代替手段を提供している場合は、syslog、logplex などを検討してください。ロギングの IOPS ボトルネックやその他の要因によっては、カスタムの再実装が可能な場合があります。

高解像度のモノトニック クロックやグローバルに並べられた GUID タイムスタンプを使用することを強くお勧めします。ウォール タイムでは、下位層のタイム ソースに同期するすべての場所で、後方補正されていない UTC を必ず使用してください。

もちろん、上記の推奨事項はアプリケーションのニーズによって異なる場合があるため、実験して賢明に実装してください。

于 2013-03-05T11:25:12.643 に答える
0

Barry のアドバイスは役に立つと思いますが、アプリケーションのログ出力を変更できない場合は、Perl の簡単な解決策を次に示します。

#!usr/bin/perl
use strict;
use warnings;

my %logs;
my $last_log;
while (<$main_log_file>)  #open that application's log in this variable.
{
    if (/pin_deferred_act:\d+:(\d+):\d/)
    {
        unless (defined $logs{$1})
        {
            open $fh,'>',"Thread$1.log") or die "Can't open Thread $1 log: $!";
            $logs{$1} = $fh;
        }

        $last_log = $logs{$1}; 
    }

    if (defined $last_log)
    {
        print {$last_log} $_;
    }
    else
    {
        #Didn't find starting line.  Error handling?    
    }
}

このソリューションは、すべてのスレッドのログ ファイルへの開いているファイル ハンドルのハッシュを維持します。入力が同じスレッド間で何度も切り替えられる場合は、より効率的であるため、私はこれを好みます。ただし、システムでファイルを開くことが許可されているよりも多くのスレッドがアプリケーションにある場合は、壊れます。

于 2013-03-05T11:44:34.797 に答える