拆分多线程应用程序的日志

时间:2013-03-05 11:09:08

标签: regex perl unix split

我有一个多线程应用程序,可以生成如上所述的日志:

    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 - &gt;其中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

2 个答案:

答案 0 :(得分:1)

文件是一种处理日志的混乱,不可扩展的方式。更好的方法是将日志作为连接源的日志条目消息流处理 - &gt;接收器(多个)。如果Oracle提供其他数据收集方法,请考虑使用syslog,logplex或类似方法。根据记录IOPS瓶颈或其他因素,自定义重新实现可能是可行的。

强烈建议使用高分辨率单调时钟和/或全局排序的GUID时间戳。在有墙壁时间的情况下,请务必使用非向后补偿的UTC到达低地层时间源。

以上建议可能会因应用程序的需要而有所不同,因此请进行明智的实验和实施。

答案 1 :(得分: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?    
    }
}

此解决方案维护所有线程的日志文件的打开文件句柄的哈希。我更喜欢这个,因为如果输入在同一个线程之间来回切换很多,那么效率更高。但是,如果应用程序的线程数多于允许在系统上打开文件的话,则会中断。