【问题标题】:capture arguments passed to a subroutine inside the package outside the subroutine捕获传递给子程序外部包内子程序的参数
【发布时间】:2010-08-16 12:01:01
【问题描述】:

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

#!/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;
}

我的问题是,有一种方法可以从包块内部捕获参数,但在子块之外,所以我不需要从每个子块调用 myLog 吗?

编辑: 这是进行调用的脚本(脚本在另一台服务器上)

#!/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;
}

我在日志文件中得到 2 行:

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 和 response 2 是测试子返回的 @something 的一部分。

我怎样才能让它打印像以前的日志示例一样的东西,我的意思是强制它在同一行上打印方法和参数,以及如何摆脱粘在被调用子名称上的“响应”字样?,我在文档中找不到任何东西(仍在搜索...)

【问题讨论】:

  • print Dumper \@soap; 而不是 print Data::Dumper->Dump([\@soap]);

标签: perl soap


【解决方案1】:

您的代码令人困惑。应该在什么时候进行 SOAP 调用?应该在什么时候记录通话?

您可以围绕 SOAP 调用创建一个包装器:

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

但是,仔细研究后,Soap::Trace 可能就是您要找的东西。

或者,您可以使用Hook::LexWrapSub::Override 为要记录的所有例程编写包装器。我怀疑Hook::LexWrap 会更适合您正在尝试做的事情。

【讨论】:

  • 我想记录通过 SOAP 调用的子例程之外的调用,作为故障安全机制,因为我有很多子程序,不想忘记添加对 myLog 的调用(@_) (还有其他人正在制作或修改子程序,我相信他们会忘记),我会尽快看看 SOAP::TRACE。
猜你喜欢
  • 2023-03-03
  • 2021-04-03
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多