Как записывать логи в файл с помощью Log4j и Storm Framework?

У меня возникла проблема с записью в файл с помощью log4j в storm.

Перед отправкой моей топологии, то есть в моем основном методе, я написал несколько операторов журнала и настроил регистратор, используя:

PropertyConfigurator.configure(myLog4jProperties)
  • Теперь, когда я запускаю свою топологию, используя мой исполняемый файл jar в eclipse, он работает нормально, и файлы журнала создаются, как предполагалось.
    ИЛИ
    Когда я запускаю свой исполняемый файл jar, используя "java -jar MyJarFile someOtherOptions", я вижу, что log4j настраивается, и файлы формируются правильно, а ведение журнала выполняется как в файлах, так и в консоли (как определено в моих log4j.properties)

  • НО когда я запускаю ту же банку, используя «storm jar MyJarFile MyMainClass someOtherOptions», она не может создавать и входить в любой из файлов, кроме как на консоли.

Я говорю о журналах, которые печатаю ДО отправки своей топологии.

Есть ли способ записать мои заявления в файл при использовании storm? Я не обязан использовать org.apache.log4j.


person holmes840    schedule 05.09.2014    source источник
comment
Вы используете локальный кластер в качестве jar exec? Когда вы используете storm jar... вы используете кластерный режим. Итак, вы проверили файл storm.log.properties в папке storm install /log4j на вашем сервере? Когда вы отправляете топологию в кластерном режиме, storm уже запущен и записывает журналы, возможно, вы не можете перезаписать log4j во время выполнения, поэтому предварительное изменение файла storm log4j должно работать во всех случаях.   -  person zenbeni    schedule 05.09.2014
comment
@zenbeni На самом деле я работаю в режиме local_mode. Я не могу найти какие-либо свойства, связанные с log4j, в каталоге установки storm. Я использую apache-storm-0.9.2-incubating.   -  person holmes840    schedule 05.09.2014


Ответы (2)


Фреймворк Storm использует собственное ведение журнала. Ваши журналы, скорее всего, окажутся в каталоге журналов, в котором установлен Storm ({Storm DIR}/logs). Вы можете найти свойства журнала шторма в {Storm DIR}/logback/cluster.xml. Он использует logback, а не log4j

person Naresh    schedule 05.09.2014
comment
Этот файл определяет свойства файлов в apache-storm-incubating-0.9.2.jar. Конечно, я могу изменить свойства для этого. Но я хочу изменить свойства ведения журнала для MyJarFile.jar. cluster.xml не повлияет на ведение журнала. А также я могу определить свойства для журналов, которые печатаются ПОСЛЕ отправки моей топологии, то есть на узлах супервизора. Я просто не могу заставить журналы (которые присутствуют в MyJarFile.jar) распечатать в файле ДО отправки моей топологии. - person holmes840; 08.09.2014
comment
как я могу использовать log4j вместо slf4j jar? - person Mani; 17.06.2015

Я бы порекомендовал использовать SLF4J для ведения журнала во время шторма. Вероятно, вы могли бы заставить LOG4J работать, но вам придется выполнить дополнительную настройку на каждом узле в кластере. Поскольку Storm уже делает это за вас, я не вижу в этом смысла.

Включите в свой проект эти зависимости maven (slf4j-simple для модульных тестов!):

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.5</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.5</version>
  <scope>test</scope>
</dependency>

Затем внутри ваших топологий/носиков/болтов вы просто получаете Logger:

private static final Logger LOG = LoggerFactory.getLogger(MySpout.class);

В моей среде любая информация INFO и выше записывается в файл и, что более важно, видима в пользовательском интерфейсе Storm. Вам просто нужно щелкнуть носик/болт, а затем щелкнуть номер порта, чтобы перейти на страницу просмотра журнала.

Если вы хотите добраться до реальных файлов, вы можете собрать их с каждого узла (мои находятся в /var/log/storm/).

person Kit Menke    schedule 07.09.2014
comment
Поэтому, когда вы говорите, что хотите перейти к фактическим файлам, вы говорите о файлах worker-‹port›.log, которые по умолчанию помещаются в каталог $STORM_HOME/logs. или вы хотите сказать, что настроили ваш файл log4j с путем /var/log/storm? Кроме того, есть ли у Storm какой-либо способ не использовать Cluster.xml и использовать ваш файл журнала, который вы отправили в банке, которую вы развернули в кластере. - person Ankur Garg; 28.10.2015
comment
@AnkurGarg Я имел в виду файлы worker-port.log. Каждый раз, когда вы вызываете LOG.info или выше внутри своей топологии, это будет регистрироваться в этих рабочих журналах и отображаться в пользовательском интерфейсе Storm. - person Kit Menke; 28.10.2015
comment
В порядке. Спасибо за ответ Кит :) - person Ankur Garg; 28.10.2015
comment
моя проблема в том, что у меня около 10 приложений, работающих на мастере. Каждый раз, когда я хочу получить файл журнала для приложения, мне нужно перейти к каждому узлу, найти порт, чтобы получить worker-xxx.log. Есть ли способ настроить имя журнала для каждого приложения? - person hoangpx; 26.07.2017