захватывать аргументы, передаваемые подпрограмме внутри пакета вне подпрограммы - PullRequest
0 голосов
/ 16 августа 2010

Я пытаюсь записать все вызовы мыла, с вызовом подпрограммы и передачей аргументов подпрограмме, мое решение было таким:

#!/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 в документации (все еще ищу ...)

1 Ответ

4 голосов
/ 16 августа 2010

Ваш код сбивает с толку. Когда должен быть сделан SOAP-вызов? Когда должен быть зарегистрирован вызов?

Вы можете создать оболочку для ваших вызовов SOAP:

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

Однако при ближайшем рассмотрении это выглядит так: Soap :: Trace может быть тем, что вы ищете.

В качестве альтернативы, вы могли бы использовать Hook :: LexWrap или Sub :: Override , чтобы писать оболочки для всех подпрограмм, которые вы хотите зарегистрировать. Я подозреваю, что Hook::LexWrap будет более подходящим для того, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...