Примеры компонентов 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 option log4j.rootLogger=INFO, file , console log4j.logger.com.javarticles=INFO, file # Direct log messages to a log file log4j.appender. file =org.apache.log4j.FileAppender log4j.appender. file .File=javarticles.log log4j.appender. file .layout=org.apache.log4j.PatternLayout log4j.appender. file .layout.ConversionPattern=%d | %p | %F %L | %m%n # Direct log messages to stdout log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.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 seconds 12:09| INFO | MarkerIgnoringBase.java 95 | Before converting to uppercase 12:09| INFO | MarkerIgnoringBase.java 95 | Exchange[ExchangePattern: InOnly, BodyType: String, Body: Log me!] 12:09| INFO | MarkerIgnoringBase.java 95 | After converting to uppercase 12: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 uppercase 14:28| INFO | MarkerIgnoringBase.java 95 | Log me! 14:28| INFO | MarkerIgnoringBase.java 95 | After converting to uppercase 14: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.872 19: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.455 19: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 . |