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 

(日期/时间戳将继续修改)。所有实例都应该放在一个文件中。

例如:

    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

应该转到一个文件 - 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 回答