2015-03-14 3 views
0

Я работаю с верблюдом apache и хотел бы добавить определенные ключи к своим журналам с помощью MDC. Я прошел через официальный Camel MDC Logging documentation, который довольно велик. Я могу записать свой маршрут без особых усилий. Мне также нужно добавить поле из тела Верблюда.Apache Camel MDC добавить поле от тела

Худший сценарий ситуации Я могу добавить это вручную во всех маршрутах, но мне было интересно, можно ли проще добавлять поля из тела в MDC?

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

Update:

Реализован пользовательский MDCUnitOfWork и завод в моем проекте. Я могу видеть CustomUnitOfWorkFactory, создавая свой CustomUnitOfWork, который затем устанавливает значения MDC.

Однако я заметил, что это происходит только в начале маршрута.

В моем случае использования, я опрос Amazon SQS в качестве моего первого маршрута. У меня нет необходимой информации здесь. На первом маршруте я создаю свой контекст и устанавливаю его в тело Camel, где находится моя информация, которую мне нужно установить в MDC.

Можно ли создать UnitOfWork перед вторым маршрутом?

ответ

2

Вы можете настроить пользовательский UnitOfWorkFactory для создания пользовательского UnitOfWork, который расширяет MDCUnitOfWork, где вы можете добавить пользовательскую информацию в MDC.

Вы можете настроить UnitOfWorkFactory на CamelContext из Java или в XML просто добавить <bean> и Camel обнаруживает и использует его

+0

Спасибо Клаус за быстрый ответ. Это похоже на правильное направление. Я внедрил свой пользовательский MDCUnitOfWork. И смог увидеть это в действии. Пожалуйста, взгляните на мой обновленный раздел, о котором идет речь. –

+0

См. MDCUnitOfWork - переопределяет контекст push/pop route, который вызывается при входе UoW в маршрут. –

+0

Спасибо Клаусу, я смог переопределить метод «beforeProcess», который, как мне кажется, также выполняется до выполнения маршрута. Работает так, как ожидалось для меня. Благодарю. –

0

мы хотели получить подобную вещь от наших маршрутов верблюдов - для регистрации конкретных свойств и заголовков с использованием MDC. К сожалению, наши маршруты транслировались, и CustomMDCUnitOfWork не пинали. Мы завершили реализацию org.apache.camel.spi.InterceptStrategy, чтобы добавить значения MDC. Если есть лучший способ сделать это с помощью трансакционных маршрутов, я был бы рад узнать ..!

5

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

Auto зарегистрировать простой боб

@Bean 
public CamelContextConfiguration contextConfiguration() { 
    return new CamelContextConfiguration() { 
     @Override 
     public void beforeApplicationStart(CamelContext context) { 
      context.setUseMDCLogging(true); 
      context.setUnitOfWorkFactory(MyUnitOfWork::new); 
     } 

     @Override 
     public void afterApplicationStart(CamelContext camelContext) { 
     } 
    }; 
} 

Затем создать свои собственные единицы работы класса

public class MyUnitOfWork extends MDCUnitOfWork { 
    public MyUnitOfWork(Exchange exchange) { 
     super(exchange); 
     if(exchange.getProperty("myProp") != null){ 
      MDC.put("myProp", (String) exchange.getProperty("myProp")); 
     } 
    } 
} 

В вашей Logback конфигурации/log4j используйте значение myProp следующим образом:

%X{myProp} 

Он должен начать регистрацию

Смежные вопросы