У меня возникли некоторые трудности при переводе журналов рабочей / топологической информации Storm в ELK-совместимый формат (JSON) с Storm 2.1.0.
Это мои текущие рабочие конфигурации регистрации:
cluster.xml
<Configuration monitorInterval="60" shutdownHook="disable" packages="ch.qos.logback.core">
<Properties>
<property name="logstash">+ %msg +%n</property> <!-- only for 'bug' demonstration purposes -->
</Properties>
<Appenders>
<Console name="CONSOLE">
<PatternLayout>
<Pattern>${logstash}</Pattern>
</PatternLayout>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="CONSOLE" />
</Root>
</Loggers>
</Configuration>
worker.xml
<Configuration monitorInterval="60" shutdownHook="disable" packages="ch.qos.logback.core">
<Properties>
<property name="logstash">{"@timestamp":"%d{yyyy-MM-ddTHH:mm:ss.SSS}", "logger": "%logger", "message":"%msg","thread_name":"%t","level":"%level"}%n</property>
</Properties>
<Appenders>
<Console name="CONSOLE">
<PatternLayout>
<Pattern>${logstash}</Pattern>
</PatternLayout>
</Console>
</Appenders>
<Loggers>
<Logger name="org.com.package" level="DEBUG" additivity="false">
<AppenderRef ref="CONSOLE"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="CONSOLE"/>
</Root>
</Loggers>
</Configuration>
В соответствии с моей конфигурацией, я бы ожидал сообщение журнала, отформатированное аналогично следующему (новые строки добавлены для ясности:
{
"@timestamp": "2020-02-11 11:32:40,748",
"logger": "org.com.package.aggregation.SomeAggregation",
"message": "joinStateStream: values: [33333333-4e30-49a6-8e1c-f7817633bb34, 7c777777-a622-4ae4-a504-2490db47cafe, 2020-02-11]",
"thread_name": "Thread-23-b-25-joinState-groupedQ-revQ-executor[22, 22]",
"level": "DEBUG"
}
Однако создается впечатление, что сообщения «упаковываются» либо процессом супервизора, либо даже самим работником. Сообщения журнала, которые я получаю, выглядят следующим образом:
(новые строки / пробел добавлен для удобства чтения)
+ Worker Process 273c05df-f087-43ca-a59a-e281bae98ab1:
{
"@timestamp":"2020-02-11 11:32:40,748",
"logger": "STDERR",
"message":
"{
"@timestamp":"2020-02-11 11:32:40,748",
"logger": "org.com.package.aggregation.SomeAggregation",
"message":"joinStateStream: values: [33333333-4e30-49a6-8e1c-f7817633bb34, 7c777777-a622-4ae4-a504-2490db47cafe, 2020-02-11]",
"thread_name":"Thread-23-b-25-joinState-groupedQ-revQ-executor[22, 22]",
"level":"DEBUG"
}",
"thread_name":"Thread-2",
"level":"INFO"} +
Здесь, кажется, происходит несколько вещей (идущих внутрь):
- Кажется, что руководитель упаковывает все рабочие сообщения и добавляет к ним
Worker Process <worker-id>:
. Это можно заметить по +
, который упаковывает все сообщение. - Работник, похоже, каким-то образом оборачивает свои собственные сообщения журнала. Часть журнала
message
содержит еще одно сообщение журнала. Можно ли отключить этот префикс журнала супервизора? Глядя на исходный код в org.apache.storm.daemon.supervisor.BasicContainer#launch
, это кажется жестко закодированным. Я не могу себе представить, что правильное развертывание топологии должно привести к жестко заданному префиксу , который добавляется к каждому сообщению в журнале.
Как может происходить это перенос рабочего сообщения? Как я вижу, «wrappee» - это мое реальное сообщение о топологии (которое я sh должен проанализировать), а «обертка» - это нечто совершенно иное (с регистратором STDERR
? Почему он регистрируется в STDERR
? С уровнем INFO
???)
По сути, я хочу просто регистрировать некоторые сообщения во время выполнения моей топологии и контролировать формат этих сообщений. Как я могу сделать это надежно с помощью Storm?