повторное сопоставление rsyslogd вызывает ошибки сегментации

#regex #rsyslog

#регулярное выражение #rsyslog

Вопрос:

Когда у меня есть правило

 if ($msg contains "foobah"
 OR re_match($msg, '(authmgr|cli)[[0-9] ]:')
)
then {
 

rsyslog в конечном итоге выдает ошибку сегментации. Даже когда я закомментирую строку, содержащую re_match it, она все равно вызовет ошибку сегментации.

 rsyslogd 8.24.0-34.el7, compiled with:
        PLATFORM:                               x86_64-redhat-linux-gnu
        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes
        GSSAPI Kerberos 5 support:              Yes
        FEATURE_DEBUG (debug build, slow code): No
        32bit Atomic operations supported:      Yes
        64bit Atomic operations supported:      Yes
        memory allocator:                       system default
        Runtime Instrumentation (slow code):    No
        uuid support:                           Yes
        Number of Bits in RainerScript integers: 64
 

Я бы хотел, чтобы это правило соответствовало событиям, которые содержат authmgr[123]: или cli:[456]: .

Может ли кто-нибудь подтвердить, что регулярное выражение правильно отформатировано, и объяснить, почему комментирование этой строки вызывает ошибку сегментации?

Комментарии:

1. rsyslog пытается обрабатывать многие устаревшие форматы ввода, поэтому вы можете попробовать сохранить все выражение if ... then { в одной строке, чтобы помочь ему распознать его как RainerScript. Я не знаю, OR должно ли быть в нижнем регистре, но обычно это то, что видно в примерах.

2. Я пробовал использовать одну и несколько строк, а также прописные и строчные буквы ИЛИ. Ни один из подходов не решает эту проблему. Правильно ли выглядит регулярное выражение?

Ответ №1:

Ответ, по-видимому, заключается в том, что вам нужно экранировать обратную косую черту внутри строк, так что это должно сработать:

 re_match($msg, '(authmgr|cli)\[[0-9] \]:')
 

В моей версии rsyslog, 8.30.0, если вы этого не сделаете, вы получите сообщение об ошибке, которое дает подсказку:
недопустимый символ «‘ в выражении — есть ли где-нибудь недопустимая escape-последовательность?

Существует онлайн-инструмент для правильного экранирования строк. Если вы предоставите ab его, он генерирует a\b .