代码之家  ›  专栏  ›  技术社区  ›  Radu Maris

捕获传递给子例程外部包内的子例程的参数

  •  0
  • Radu Maris  · 技术社区  · 14 年前

    我尝试记录所有soap调用,调用subrutine并将参数传递给子例程,我的解决方案是:

    #!/usr/bin/perl -w
    use SOAP::Transport::HTTP;
    
    SOAP::Transport::HTTP::CGI   
        -> dispatch_to('SoapStatus')
        -> handle;
    
    package SoapStatus;
    
    use POSIX qw(strftime);
    
    # Can I capture arguments and called sub from here ?
    #&myLog(@_);
    
    sub myLog
    {
        my $now_string = POSIX::strftime "%Y-%m-%d %H:%M:%S", localtime;
        open(my $tmp_file, ">>", "/tmp/soap.log") or die "Can not open log file: $!\n";
        print $tmp_file $now_string.' '.$ENV{'REMOTE_USER'}.' '.$ENV{'REMOTE_ADDR'}.' '.(caller(1))[3].'('.(join(', ', @_)).')'."\n";
        close($tmp_file) or die "Can not close file: $!\n";
        return 0;
    }
    
    sub test
    {
        myLog(@_);
        ...
        return @something;
    }
    

    编辑:

    #!/usr/bin/perl -w
    use SOAP::Lite;
    use Data::Dumper;
    $user='myUser';
    $pass='myPass';
    
    @soap = SOAP::Lite
      -> uri('https://example.com/SoapStatus')
      -> proxy('https://'.$user.':'.$pass.'@example.com/cgi-bin/soap/soap.cgi')
      -> test('var1', 'var2')
      -> result;
    print Dumper \@soap;
    

    日志文件如下所示:

    2010-08-16 17:38:33 myUser 10.10.10.1 SoapStatus::test(SoapStatus, var1, var2)
    2010-08-16 17:38:47 myUser 10.10.10.1 SoapStatus::test(SoapStatus, var1, var2)
    

    在服务器脚本中使用SOAP跟踪:

    #!/usr/bin/perl -w
    use SOAP::Transport::HTTP;
    use POSIX qw(strftime);
    
    SOAP::Transport::HTTP::CGI   
        -> dispatch_to('SoapStatus')
        -> handle;
    use SOAP::Lite +trace => [ method, parameters => \&myLog ];
    
    sub myLog
    {
        my $now_string = POSIX::strftime "%Y-%m-%d %H:%M:%S", localtime;
        open(my $tmp_file, ">>", "/tmp/soap.log") or die "Can not open log file: $!\n";
        print $tmp_file $now_string.' '.$ENV{'REMOTE_USER'}.' '.$ENV{'REMOTE_ADDR'}.' '.(join(', ', @_)).')'."\n";
        close($tmp_file) or die "Can not close file: $!\n";
        return 0;
    }
    
    package SoapStatus;
    
    sub test
    {
        myLog(@_);
        ...
        return @something;
    }
    

    日志文件中有两行:

    2010-08-16 17:19:56 radu.maris 193.231.238.8 var1,var2
    2010-08-16 17:19:56 radu.maris 193.231.238.8 testResponse,response1,response2
    

    response1和response2是testsub返回的@something的一部分。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Sinan Ünür    14 年前

    你的代码很混乱。什么时候应该进行SOAP呼叫?什么时候应该记录通话?

    sub log_and_dispatch {
        log_soap( @_ );
        dispatch_soap( @_ );
    }
    

    然而,仔细检查,它看起来像 Soap::Trace 可能就是你要找的。

    Hook::LexWrap Sub::Override 为所有要记录的例程编写包装器。我怀疑 Hook::LexWrap 会更适合你想做的事。