首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获参数传递给子例程之外的包内的子例程。

捕获参数传递给子例程之外的包内的子例程。
EN

Stack Overflow用户
提问于 2010-08-16 12:01:01
回答 1查看 290关注 0票数 0

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

代码语言:javascript
运行
复制
#!/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?

编辑:--这是调用的脚本(脚本位于另一台服务器上)

代码语言:javascript
运行
复制
#!/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;

日志文件如下所示:

代码语言:javascript
运行
复制
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跟踪:

代码语言:javascript
运行
复制
#!/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行:

代码语言:javascript
运行
复制
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和响应2是测试子返回的@ the的一部分。

我如何使它打印类似透水日志的例子,我的意思是强迫它打印方法和参数在同一行,以及如何摆脱“响应”字的名称,被称为?,我找不到在文档中的阴离子(仍在搜索.)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-16 12:10:28

你的代码很混乱。什么时候应该打肥皂电话?电话什么时候被记录?

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

代码语言:javascript
运行
复制
sub log_and_dispatch {
    log_soap( @_ );
    dispatch_soap( @_ );
}

然而,仔细研究一下,看起来肥皂::跟踪可能就是您要找的东西。

或者,您可以使用钩子::凌志卷次级::覆盖为您想要记录的所有例程编写包装器。我怀疑Hook::LexWrap会更适合你想要做的事情。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3492884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档