Regex для обработки всех многострочных исключений в rubular fluentd

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

(SLF4J:\s.*|[a-zA-z_]*\..*\.*\s.*\s.*|Caused\sby:\s|\s+at\s.*|\s+\.\.\. (\d)+ more)

Он соответствует ненужным полям.

Я хочу сопоставить все начало исключения или многострочного предупреждения. Вкратце: самая последняя многострочная запись будет прочитана с начала файла до следующей строки, поскольку JSON.JSON всегда начинается с { вместе. когда мы видим строки, начинающиеся с {, мы перестаем читать многострочные

одно регулярное выражение для обоих случаев или 2 регулярных выражения для обоих случаев в порядке

Демонстрационная ссылка

Регулярное выражение доступно по адресу: https://rubular.com/r/O26Wm6mc7z51re

Регулярное выражение доступно по адресу: https://rubular.com/r/v6Q7iwZqmNDAAx

Тестовые строки:

java.lang.InterruptedException: Timeout while waiting for epoch from quorum
        at org.apache.zookeeper.server.quorum.Leader.getEpochToPropose(Leader.java:1227)
        at org.apache.zookeeper.server.quorum.Leader.lead(Leader.java:482)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1284)
        ... 19 more
{"log_timestamp": "2021-02-18T11:33:23.114+0000", "log_level": "WARN", "process_id": "zookeeper#2", "process_name": "zookeeper", "thread_id": 1, "thread_name": "QuorumPeer[myid=2](plain=/0.0.0.0:2181)(secure=disabled)", "action_name": "org.apache.zookeeper.server.quorum.QuorumPeer", "log_message": "PeerState set to LOOKING"}
{"log_timestamp": "2021-02-18T11:33:23.115+0000", "log_level": "WARN", "process_id": "zookeeper#2", "process_name": "zookeeper", "thread_id": 1, "thread_name": "WorkerSender[myid=2]", "action_name": "org.apache.zookeeper.server.quorum.QuorumPeer", "log_message": "Failed to resolve address: zk-2.zk-headless.intam.svc.cluster.local"}
java.net.UnknownHostException: zk-2.zk-headless.intam.svc.cluster.local
        at java.net.InetAddress.getAllByName0(InetAddress.java:1281)
        at java.net.InetAddress.getAllByName(InetAddress.java:1193)
        at java.net.InetAddress.getAllByName(InetAddress.java:1127)
        at java.net.InetAddress.getByName(InetAddress.java:1077)
        at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.recreateSocketAddresses(QuorumPeer.java:194)
        at org.apache.zookeeper.server.quorum.QuorumPeer.recreateSocketAddresses(QuorumPeer.java:764)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:699)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:618)
        at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:477)
        at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:456)
        at java.lang.Thread.run(Thread.java:748)
{"log_timestamp": "2021-02-18T11:33:23.115+0000", "log_level": "WARN", "process_id": "zookeeper#2", "process_name": "zookeeper", "thread_id": 1, "thread_name": "WorkerSender[myid=2]", "action_name": "org.apache.zookeeper.server.quorum.QuorumPeer", "log_message": "Failed to resolve address: zk-2.zk-headless.sxc.svc.cluster.local"}

Ожидаемое совпадение: Для demo1: https://rubular.com/r/O26Wm6mc7z51re

java.lang.InterruptedException: Timeout while waiting for epoch from quorum
        at org.apache.zookeeper.server.quorum.Leader.getEpochToPropose(Leader.java:1227)
        at org.apache.zookeeper.server.quorum.Leader.lead(Leader.java:482)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1284)
        ... 19 more

Для demo2:https://rubular.com/r/v6Q7iwZqmNDAAx

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/spark/jars/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/spark/jars/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type 

person SKumar    schedule 18.02.2021    source источник


Ответы (1)


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

^(SLF4J:|java\.lang\.InterruptedException:).*(?:\R(?!\1|{).*)*

Шаблон соответствует:

  • ^ Начало строки
  • (SLF4J:|java\.lang\.InterruptedException).* Захватите в группе 1, совпадающую с любой из альтернатив
  • (?: Non capture group
    • \R(?!\1|{).* Match a newline and assert that the string does not start with either wat is captured in group 1 or {
  • )* Закройте группу и, при желании, повторите, чтобы сопоставить все строки

демонстрация регулярных выражений

См. соответствие rubular для первой части и вторая часть.

Обратите внимание, что в Java для удвоения обратной косой черты

String regex = "^(SLF4J:|java\\.lang\\.InterruptedException:).*(?:\\R(?!\\1|\\{).*)*";

Чтобы не пересекать SLF4J или другие типы исключений, обозначенных как строки, разделенные точками в начале строки:

^(?:SLF4J:|\w+(?:\.\w+)+).*(?:\R(?!(?:SLF4J:|\w+(?:\.\w+)+)|{).*)*

демонстрация регулярных выражений

person The fourth bird    schedule 18.02.2021
comment
исключение может начинаться с любых имен. В нашем примере java.lang.InterruptedException это может быть xxx.yyy.zzz или может быть org.apache.xxx. Можем ли мы сделать жестко запрограммированное значение общим - person SKumar; 18.02.2021
comment
@SKumar Нравится? regex101.com/r/jzHKE4/1 - person The fourth bird; 18.02.2021
comment
org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:699) dorg.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManorg.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager. java:699) dddddddd это не останавливается на 699), это также берет следующую строку ddd., Для любого исключения мы можем остановиться на 699) - person SKumar; 18.02.2021
comment
@SKumar См. regex101.com/r/snNP5e/1 - person The fourth bird; 18.02.2021
comment
Мне нужны только все первые появления многострочных строк. Согласно вашему регулярному выражению, он доступен по адресу: rubular.com/r/xNbOmFdTFV8Hlx. - person SKumar; 18.02.2021
comment
@SKumar Нравится? rubular.com/r/d6uRi8GsDFPwk1 - person The fourth bird; 18.02.2021
comment
Например, как указано выше, я хочу только это, а не все - person SKumar; 18.02.2021
comment
java.lang.InterruptedException: тайм-аут при ожидании эпохи от кворума на org.apache.zookeeper.server.quorum.Leader.getEpochToPropose(Leader.java:1227) на org.apache.zookeeper.server.quorum.Leader.lead(Leader .java:482) на org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1284) ... еще 19 - person SKumar; 18.02.2021
comment
Все, что ниже, будет отклонено. Всегда выглядит как начало всего многострочного. Но ваше решение идеально. Если это возможно в регулярном выражении, я могу избежать логики в коде. - person SKumar; 18.02.2021
comment
@SKumar Код на Ruby или на Java? - person The fourth bird; 18.02.2021
comment
FluentD собирает журналы и отправляет их в kibana. Во время отправки мы применяем ваше регулярное выражение для устранения многострочного кода. Fluentd принимает re.gex в стиле Rubby. Если регулярное выражение работает напрямую, нам не нужен собственный настраиваемый плагин. - person SKumar; 18.02.2021
comment
@SKumar Другим вариантом может быть, например, rubular.com/r/SSbpFsXXknZbCL с флагом m и захватом группа. Другие шаблоны также будут работать в Java, вам просто нужно получить только первое совпадение. - person The fourth bird; 18.02.2021
comment
В общем, исключение останавливается на (на 3 точки больше), например ... еще на 11. Я написал для этого как \.\.\. (\ d)+ больше. В моем случае 3dots numbr more является необязательным. но из моих данных я понял, что прекращу многострочное чтение, когда получу [3dots numbr more] или следующая строка будет json. - person SKumar; 18.02.2021
comment
Вкратце: самая последняя многострочная строка будет прочитана с начала файла до получения следующей строки, поскольку JSON.JSON всегда начинается с {togather. когда мы видим строки, начинающиеся с {, мы перестаем читать многострочные - person SKumar; 18.02.2021
comment
К сожалению, это не работает в rubby-коде - person SKumar; 19.02.2021
comment
Ваше регулярное выражение доступно по адресу: rubular.com/r/4hrpKb29nQgyH5. - person SKumar; 19.02.2021
comment
приведенное ниже регулярное выражение работает в плагине ruby ​​для Fluent d, но делает ненужную запись :: Ваше регулярное выражение доступно по адресу: rubular.com/ р/IFEwL8Sk998muT - person SKumar; 19.02.2021
comment
мы можем проверить регулярное выражение здесь: fluentular.herokuapp.com/parser - person SKumar; 19.02.2021