【问题标题】:split log of a multi-threaded application多线程应用程序的拆分日志
【发布时间】:2013-03-05 11:09:07
【问题描述】:

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

    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

【问题讨论】:

  • 你有什么问题?你自己试过吗?
  • @Dan,我尝试了以下方法:>awk '/1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:/{i++}{print > "Thread" i}' 日志文件 每次遇到“1:App-BRM-Prod-Pri.acttv.in:pin_deferred_act:10233:1:”时都会创建单独的文件,而我希望将其连接到每个线程的一个文件中。另外,我尝试了 csplit ,但没有得到太多帮助。我尝试了一些正则表达式,但在第一次模式匹配后我只能获取以下行,但每次都无法获取。

标签: regex perl unix split


【解决方案1】:

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

强烈建议使用高分辨率单调时钟和/或全局排序的 GUID 时间戳。对于挂壁时间,请务必在与低层时间源同步的所有地方使用非向后补偿的 UTC。

上述建议当然会根据应用的需要而有所不同,所以请明智地尝试和实施。

【讨论】:

  • 谢谢巴里,但问题是我无权访问源代码来修改日志消息。
【解决方案2】:

我认为 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-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2020-02-01
    相关资源
    最近更新 更多