Perl Regex для соответствия шаблону

Я использую плагин nagios (check_logs) для сканирования моих журналов и отправки предупреждений, он основан на языке perl. я пытаюсь найти конкретную ошибку в моем файле журнала, но она не соответствует я не знаю, какую ошибку я делаю.

"POST /aimm/mweb/render.ps? HTTP/1.1" 500

Приведенная выше строка, которую я хочу сопоставить, используя регулярное выражение

"POST \/aimm\/mweb\/render.ps? HTTP\/1.1" 500

Приведенную выше строку я пытался сопоставить с шаблоном, но она не работает, пожалуйста, помогите мне решить эту тему.

Это точный тег nagios

{
                tag => "rplogcheck",
                type => 'rotating::uniform',
                logfile => "/opt/fundamo/apache/logs/nofile",
                rotation => "access[_\\d{4}\\-\\d{2}\\-\\d{2}]*.log",
                criticalpatterns => [
                '/"POST \/aimm\/mweb\/render\.ps\? HTTP\/1\.1" 500/'
],

options => 'noprotocol,sticky=300'
    }

);

он не показывает никаких ошибок, но также не ищет точный шаблон, обычные шаблоны, которые я могу сопоставить, проверены в nagios, также синтаксис кажется правильным.

до сих пор не могу понять, какую ошибку я делаю при сопоставлении с образцом.


person Anish Kumar    schedule 15.10.2014    source источник
comment
Знак вопроса ? — это специальный символ регулярного выражения. Убежать от этого.   -  person Miller    schedule 15.10.2014
comment
\QPOST /aimm/mweb/render.ps? HTTP/1.1 500\E   -  person MattSizzle    schedule 15.10.2014
comment
Что означает: rotation => "access[_\\d{4}\\-\\d{2}\\-\\d{2}]*.log",   -  person Toto    schedule 15.10.2014
comment
Зачем вообще использовать регулярное выражение?   -  person reinierpost    schedule 15.10.2014


Ответы (1)


Знак вопроса ? — это специальный символ регулярного выражения для совпадающего повторения 1 или 0 раз.

Вам нужно избежать этого:

"POST \/aimm\/mweb\/render\.ps\? HTTP\/1\.1" 500

Кроме того, период . также является специальным символом регулярного выражения, поэтому его также следует экранировать.

Если вы пытаетесь сопоставить литеральную строку в Perl, я бы рекомендовал использовать альтернативный разделитель и quotemeta< /a> чтобы вообще ничего не экранировать:

while (<DATA>) {
    print if m{\Q"POST /aimm/mweb/render.ps? HTTP/1.1" 500};
}

__DATA__
"POST /aimm/mweb/render.ps? HTTP/1.1" 500
person Miller    schedule 15.10.2014