Статьи

Примеры компонентов Apache Camel Log

Примеры компонентов Apache Camel Log

Вы хотите записывать сообщения в базовый механизм ведения журнала, используйте Camel’s log: component. Camel использует sfl4j в качестве API регистратора, а затем позволяет настроить реализацию регистратора. В этой статье мы будем использовать Log4j в качестве фактического механизма ведения журнала. Давайте начнем с наших примеров.

зависимости

Вам необходимо добавить:

  1. slf4j-api — SLF4J Logger API
  2. 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
    <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="
       ">
    <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>
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <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 .