2015-04-16 3 views
0

Я написал пару функций для обработки журналов и grep для строки. Я вычленить информацию строки 100.81.2.59:4500', 'dst:172.25.150.190:4500' .Когда функция называется Бревна хвостами, как и следовало ожидать, упомянутые выше строки также присутствуют в журналах, но функция всегда возвращаетФункция Perl для grep строки

WARN Not found "string" n ipsecd.log 

Функция:

sub tail_logs{ 

    my ($self) = @_; 
    my $cmd = 'tail -n 500 /a/logs/ipsecd.log | grep NAT'; 
    $self->execute('$cmd'); 

    if ($self->execute($cmd)) { 
     return $self->get_stdout(); 
     } 
    else { 
      die " Failed to execute $cmd"; 
     } 
} 


sub grep { 
    my ($self,$logLines, @strings) = @_; 

    for my $string (@strings) { 
     if ($logLines =~ /$string/) { 
      INFO("Found $string in ipsecd.log"); 
     } 
     else { 
      #return false, we cound find $string 
      WARN("Not Found $string in ipsecd.log"); 
      return 0; 
     } 
    } 
    # found all strings in the $loglines, return true. 
    return 1; 

} 

вызов функции:

my @checkStrings = ('100.81.2.59:4500', 'dst:172.25.150.190:4500'); 

    $self->{'log'} = $self->{'log_obj'}->tail_logs(); 

    $self->{'log_verify'}= $self->{'log_obj'}->grep($self->{'log'}, @checkStrings); 

    if ($self->{'log_verify'}) { 
     $self->assert(
      $self->{'log_verify'}, 
      'Found info in ipsecd.logs' 
     ); 

Loglines

[04-15 21:17:04.614251 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:04.821548 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:05.029262 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:05.237628 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:05.444636 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
+0

Пожалуйста, предоставьте [короткий, самосохраненный, правильный пример] (http://sscce.org). Какие модули вы используете? – choroba

+0

@choroba Я не использую никаких модулей perl cpan. Эти две функции являются частью библиотеки, которую я создал, и я вызываю эти две функции из своего тестового сценария. – user3587025

+0

http://www.perlmonks.org/?node_id=1124151 – choroba

ответ

0

Я не знаю, какие библиотеки вы используете, но после упрощения кода я не могу воспроизвести описанное вами поведение.

#!/usr/bin/perl 
use warnings; 
use strict; 

{ package My::L; 

    sub new { bless {}, shift } 

    sub tail_logs{ 
     my $cmd = "tail -n 5 $0 | grep NAT"; 
     my $o = `$cmd`; 
     return $o 
    } 


    sub Grep { 
     my ($self, $logLines, @strings) = @_; 

     for my $string (@strings) { 
      if ($logLines =~ /$string/) { 
       warn "INFO: Found $string in ipsecd.log"; 
      } else { 
       warn "WARN: Not Found $string in ipsecd.log"; 
       return 0 
      } 
     } 
     return 1 
    } 
} 

my $self; 
$self->{log_obj} = 'My::L'->new; 

my @checkStrings = ('100.81.2.59:4500', 'dst:172.25.150.190:4500'); 

$self->{log} = $self->{log_obj}->tail_logs(); 
$self->{log_verify} = $self->{log_obj}->Grep($self->{log}, @checkStrings); 
warn 'Found info in ipsecd.logs' if $self->{log_verify}; 

__DATA__ 
[04-15 21:17:04.614251 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:04.821548 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:05.029262 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:05.237628 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 
[04-15 21:17:05.444636 (05026) D ipsec_processor.: 496] processOutbound: IPsec EDP-UDP (NAT-T) packet to destination - src addr:100.81.2.59:4500 dst:172.25.150.190:4500 

Обратите внимание, что '$cmd' не интерполировать значения переменной, используйте

$self->execute($cmd); 

без одинарных кавычек.

Также обратите внимание, что grep является функцией Perl. Вы действительно хотите назвать свой метод тем же?

0

Как отмечался на PerlMonks нити, на которую ссылаются @choroba, я подозреваю, что это может быть ваша проблема:

for my $string (@strings) { 
    if ($logLines =~ /$string/) { 

Если нутро чувствует быть добро, проблема здесь заключается в том, что вы кормите его строку, где ожидается регулярное выражение.

Рассмотрите возможность использования QuoteMeta конвертировать:

for my $string (@strings) { 
    my $regex = quotemeta $string; 
    if ($logLines =~ /$regex/) { 

Но это всего лишь предположение, так как вам не кажется, что отвечать на чьи-либо вопросы больше.

Смежные вопросы