Я пытаюсь записать все вызовы мыла, с вызовом подпрограммы и передачей аргументов подпрограмме, мое решение было таким:
#!/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 из каждой подпрограммы?
EDIT:
Это скрипт, в котором выполняется вызов (скрипт находится на другом сервере)
#!/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, возвращаемого тестовым подпрограммой.
Как я могу заставить его печатать что-то похожее на предыдущий пример журнала, я имею в виду заставить его печатать метод и параметры в одной строке и как избавиться от слова "Response", которое привязано к имени подпрограммы, называемой ?, Я не могу найти anithing в документации (все еще ищу ...)