Примеры компонентов Apache Camel Log
Вы хотите записывать сообщения в базовый механизм ведения журнала, используйте Camel’s log: component. Camel использует sfl4j в качестве API регистратора, а затем позволяет настроить реализацию регистратора. В этой статье мы будем использовать Log4j в качестве фактического механизма ведения журнала. Давайте начнем с наших примеров.
зависимости
Вам необходимо добавить:
-
slf4j-api— SLF4J Logger API -
slf4j-log4j12— Log4j как реализация логгера
pom.xml:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <modelVersion>4.0.0</modelVersion> <groupId>com.javarticles.camel</groupId> <artifactId>camelHelloWorld</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>2.15.1</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-stream</artifactId> <version>2.15.1</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jms</artifactId> <version>2.15.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-camel</artifactId> <version>5.6.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> <version>2.15.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> </dependencies></project> |
Формат URI компонента журнала
Формат журнала URI:
|
1
|
log:loggingCategory[?options] |
Вы можете использовать параметры, чтобы установить уровень или параметры форматирования. Например:
|
1
|
log:com.javarticles?level=INFO |
В моем log4.properties корневой регистратор регистрирует в файл, а также в консоль, тогда как он регистрирует только в файл для категории com.javarticles . log4j.properties:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
# Root logger optionlog4j.rootLogger=INFO, file, consolelog4j.logger.com.javarticles=INFO, file# Direct log messages to a log filelog4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=javarticles.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d | %p | %F %L | %m%n # Direct log messages to stdoutlog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{HH:mm}| %p | %F %L | %m%n |
Примеры компонентов Camel Log
CamelLogExample:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package com.javarticles.camel.components;import org.apache.camel.CamelContext;import org.apache.camel.ProducerTemplate;import org.apache.camel.builder.RouteBuilder;import org.apache.camel.impl.DefaultCamelContext;import org.apache.camel.util.jndi.JndiContext;public class CamelLogExample { public static final void main(String[] args) throws Exception { JndiContext jndiContext = new JndiContext(); jndiContext.bind("stringUtils", new StringUtils()); CamelContext camelContext = new DefaultCamelContext(jndiContext); try { camelContext.addRoutes(new RouteBuilder() { public void configure() { from("direct:logExample") .log("Before converting to uppercase") .to("log:?level=INFO&showBody=true") .to("bean:stringUtils?method=upperCase") .log("After converting to uppercase") .to("log:com.javarticles?level=INFO&showAll=true"); } }); ProducerTemplate template = camelContext.createProducerTemplate(); camelContext.start(); template.sendBody("direct:logExample", "Log me!"); } finally { camelContext.stop(); } }} |
Выход:
|
1
2
3
4
5
6
|
12:09| INFO | DefaultCamelContext.java 2454 | Apache Camel 2.15.1 (CamelContext: camel-1) started in 0.307 seconds12:09| INFO | MarkerIgnoringBase.java 95 | Before converting to uppercase12:09| INFO | MarkerIgnoringBase.java 95 | Exchange[ExchangePattern: InOnly, BodyType: String, Body: Log me!]12:09| INFO | MarkerIgnoringBase.java 95 | After converting to uppercase12:09| INFO | MarkerIgnoringBase.java 95 | Exchange[Id: ID-INMAA1-L1005-54363-1431153589693-0-2, ExchangePattern: InOnly, Properties: {CamelCreatedTimestamp=Sat May 09 12:09:50 IST 2015, CamelMessageHistory=[DefaultMessageHistory[routeId=route1, node=log1], DefaultMessageHistory[routeId=route1, node=to1], DefaultMessageHistory[routeId=route1, node=to2], DefaultMessageHistory[routeId=route1, node=log2], DefaultMessageHistory[routeId=route1, node=to3]], CamelToEndpoint=log://com.javarticles?level=INFO&showAll=true}, Headers: {breadcrumbId=ID-INMAA1-L1005-54363-1431153589693-0-1}, BodyType: String, Body: LOG ME!, Out: null: ]12:09| INFO | DefaultCamelContext.java 2660 | Apache Camel 2.15.1 (CamelContext: camel-1) is shutting down |
Custom Exchange Formatter
Если вы заметите в журнале выше, что даже для showBody=true , он печатает полезную нагрузку, а также связанные с обменом свойства, такие как ExchangePattern и BodyType . Мы можем настроить то, что мы хотим видеть в журнале. Посмотрим, как нам этого добиться. Реализуйте пользовательский класс форматера путем реализации интерфейса ExchangeFormatter . Выберите из объекта Exchange какие элементы мы хотим зарегистрировать. В нашем пользовательском модуле форматирования обмена мы просто хотим видеть текст полезной нагрузки, поэтому возвращаемое format(Exchange) — это сообщение входящего запроса. MyExchangeFormatter:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
package com.javarticles.camel.components;import org.apache.camel.Exchange;import org.apache.camel.spi.ExchangeFormatter;public class MyExchangeFormatter implements ExchangeFormatter { public String format(Exchange exchange) { return exchange.getIn().getBody(String.class); }} |
Вам необходимо привязать объект-пенеттер к ключу logFormatter .
|
1
|
jndiContext.bind("logFormatter", new MyExchangeFormatter()); |
CamelLogExchangeFormatterExample:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.javarticles.camel.components;import org.apache.camel.CamelContext;import org.apache.camel.ProducerTemplate;import org.apache.camel.builder.RouteBuilder;import org.apache.camel.impl.DefaultCamelContext;import org.apache.camel.util.jndi.JndiContext;public class CamelLogExchangeFormatterExample { public static final void main(String[] args) throws Exception { JndiContext jndiContext = new JndiContext(); jndiContext.bind("stringUtils", new StringUtils()); jndiContext.bind("logFormatter", new MyExchangeFormatter()); CamelContext camelContext = new DefaultCamelContext(jndiContext); try { camelContext.addRoutes(new RouteBuilder() { public void configure() { from("direct:logExample") .log("Before converting to uppercase") .to("log:?level=INFO") .to("bean:stringUtils?method=upperCase") .log("After converting to uppercase") .to("log:com.javarticles?level=INFO"); } }); ProducerTemplate template = camelContext.createProducerTemplate(); camelContext.start(); template.sendBody("direct:logExample", "Log me!"); } finally { camelContext.stop(); } }} |
StringUtils:
|
1
2
3
4
5
6
7
8
|
package com.javarticles.camel.components;public class StringUtils { public String upperCase(String msg) { return msg.toUpperCase(); }} |
Выход:
|
1
2
3
4
|
14:28| INFO | MarkerIgnoringBase.java 95 | Before converting to uppercase14:28| INFO | MarkerIgnoringBase.java 95 | Log me!14:28| INFO | MarkerIgnoringBase.java 95 | After converting to uppercase14:28| INFO | MarkerIgnoringBase.java 95 | LOG ME! |
Пример регистратора пропускной способности
Сообщения (номера в нашем случае) отправляются на номера очереди activemq, следующий пункт назначения в маршруте будет регистрировать статистику сообщений каждые 10 секунд. Интервал настраивается с использованием параметра groupInterval=10000 .
|
1
2
3
4
|
<route> <from uri="activemq:queue:numbers" /> <to uri="log:com.javarticles?level=INFO&groupInterval=10000" /></route> |
applicationContext.xml:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
<?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="vm://localhost?broker.persistent=false" /> </bean> <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"> <property name="connectionFactory" ref="connectionFactory" /> </bean> <route> <from uri="activemq:queue:numbers" /> <to uri="log:com.javarticles?level=INFO&groupInterval=10000" /> </route> </camelContext> </beans> |
CamelThroughputLoggerExample:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.javarticles.camel.components;import org.apache.camel.CamelContext;import org.apache.camel.ProducerTemplate;import org.apache.camel.spring.SpringCamelContext;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class CamelThroughputLoggerExample { public static final void main(String[] args) throws Exception { ApplicationContext appContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); CamelContext camelContext = SpringCamelContext.springCamelContext( appContext, false); try { ProducerTemplate template = camelContext.createProducerTemplate(); camelContext.start(); for (int i = 0; i <18000; i++) { template.sendBody("activemq:queue:numbers", i); } Thread.sleep(10000); } finally { camelContext.stop(); } }} |
Выход:
|
1
2
3
|
19:04| INFO | MarkerIgnoringBase.java 95 | Received: 281 new messages, with total 281 so far. Last group took: 470 millis which is: 597.872 messages per second. average: 597.87219:04| INFO | MarkerIgnoringBase.java 95 | Received: 14802 new messages, with total 15083 so far. Last group took: 10001 millis which is: 1,480.052 messages per second. average: 1,440.45519:05| INFO | MarkerIgnoringBase.java 95 | Received: 2917 new messages, with total 18000 so far. Last group took: 10000 millis which is: 291.7 messages per second. average: 879.293 |
Скачать исходный код
Это был пример о компоненте журнала Camel. Вы можете скачать исходный код здесь: camelLogComponentExamples.zip
| Ссылка: | Примеры компонентов Apache Camel Log от нашего партнера по JCG Рама Моккапати в блоге статей Java . |