Дополнительные модификаторы формата Log4j и сопоставление регулярных выражений LogFilePatternReceiver - PullRequest
0 голосов
/ 09 июля 2011

Я использую класс Log4j LogFilePatternReceiver для чтения некоторых простых файлов журнала, и мне было интересно, есть ли какой-либо способ указать Log4j интерпретировать модификатор формата как необязательный.

Например, предположим следующий шаблон:

%r [%t] %p %c %x - %m%n

Это соответствует строке

123 [main] INFO org.apache.log4j.whatever x=8 - Just a message.

, но не строке

123 [main] INFO org.apache.log4j.whatever - Just a message.

(то есть, то же, что и выше, но без "x = 8""part).

Есть ли способ сообщить Log4j, что они совпадают?

В другой соответствующей заметке, добавив пару дополнительных операторов print в исходный код LogFilePatternReceiver, я получаю

Pattern: {%r [%t] %p %c %x - %m%n}
Regex:   {(.*?)[ ]+\[(.*?)\][ ]+(\S*\s*?)[ ]+(\S*\s*?)[ ]+(.*)[ ]+\-[ ]+(.*?)}

, где фигурные скобки просто обозначают начало / конец каждого выражения, не принадлежащего ему, просто чтобы убедиться, что в них нет лишних пробелов или других символов.Регулярное выражение создается с помощью LogFilePatternReceiver в конце метода initialize().

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

123 [main] INFO org.apache.log4j.whatever x=8 - 

(с пробелом в конце).По-видимому, для включения сообщения регулярное выражение необходимо закрыть знаком $.

Я делаю какую-либо ошибку в определении шаблона?

Ответы [ 2 ]

0 голосов
/ 10 июля 2011

Попробуйте этот LogFormat для вашего LogFilePatternReceiver (обратите внимание на * подстановочный знак)

PROP (RELATIVETIME) [THREAD] LEGEL LOGGER * PROP (X) - СООБЩЕНИЕ

0 голосов
/ 09 июля 2011

Последние скобки заключают в себе ленивый квантификатор: .*? означает «соответствовать нулю или большему количеству символов, как можно меньше».Это означает, что пустая строка является допустимым соответствием (что имеет смысл в других частях вашего регулярного выражения, потому что после этого есть вещи, которые вы не хотите сожрать предыдущей частью регулярного выражения).

Использование.* вместо этого, что означает «соответствовать нулю или большему количеству символов, насколько это возможно»:

(.*?) +\[(.*?)\] +(\S*\s*?) +(\S*\s*?) +(.*) +- +(.*)
...