#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
.