2017-01-29 5 views
4

OozieからJavaアクションとして実行されるSpringブートアプリケーションからログ出力をキャプチャする方法を聞かれました。KafkaへのSpring-Bootロギング:警告を排除する方法。ベストプラクティス

私の最初の考えは、いくつかのlog4jプロパティを編集して、YARNまたはOozie内のアプリケーションログをキャプチャすることが可能であるということでした。それから、Kafkaは、さまざまなクラスタノードで実行される特定のアプリケーションのログメッセージを取得して集約するもっと簡単な方法になります。トピックにサブスクライブすることで、ログファイルを介した釣りよりも分散システムを監視する方がはるかに簡単です。

私は、Kafkaがlog4jアペンダーを持っていることに気が付いたので、私は最小限の再現可能な例(github:https://github.com/alexwoolford/spring-boot-log-to-kafka-example)を作成しようとしました。ここでpom.xmlからの抜粋です:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.4.RELEASE</version> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-logging</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>logback-classic</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-log4j</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.kafka</groupId> 
     <artifactId>kafka-log4j-appender</artifactId> 
     <version>0.10.0.0</version> 
    </dependency> 
    <dependency> 
     <groupId>net.logstash.log4j</groupId> 
     <artifactId>jsonevent-layout</artifactId> 
     <version>1.7</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
     <version>1.2</version> 
    </dependency> 
</dependencies> 

私のlog4j.propertiesファイルは、次のようになります。

log4j.rootLogger=INFO 
log4j.appender.KAFKA=org.apache.kafka.log4jappender.KafkaLog4jAppender 
log4j.appender.KAFKA.layout=net.logstash.log4j.JSONEventLayoutV1 
log4j.appender.KAFKA.topic=logs 
log4j.appender.KAFKA.brokerList=hdp-single-node:6667 
log4j.appender.KAFKA.syncSend=true 
log4j.appender.KAFKA.producer.type=async 
log4j.logger.io.woolford=INFO, KAFKA 

これは動作しますが、それは警告を生成することを除いて:でも、このアプリケーションかかわら

log4j:WARN No appenders could be found for logger (org.apache.kafka.clients.producer.ProducerConfig). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

を私が必要とするものを実行すると、警告は私が何かを誤って構成したことを示唆しています。変更が必要なものが見えますか?

デフォルトでは、Spring BootにはLogbackが使用されています。オープンソースプロジェクトlogback-kafka-appenderがあることに気づき、LogbackをKafkaに追加することができます。 Kafkaのlog4jアペンダーは、Spring BootがKafkaにログインする最も良い方法ですか?

答えて

4

Log4j2はKafka appenderです。 pom.xmlspring-boot-starter-log4j2jackson-databindアーティファクトを追加する必要がありました:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="info" name="spring-boot-log-to-kafka-example" packages="io.woolford"> 
    <Appenders> 
     <Kafka name="kafkaAppender" topic="logs"> 
      <JSONLayout /> 
      <Property name="bootstrap.servers">hdp-single-node:6667</Property> 
     </Kafka> 
    </Appenders> 
    <Loggers> 
     <Root level="INFO"> 
      <AppenderRef ref="kafkaAppender"/> 
     </Root> 
     <Logger name="org.apache.kafka" level="WARN" /> 
    </Loggers> 
</Configuration> 

ログメッセージをJSON形式でカフカに送信され、例えば:

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-logging</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>logback-classic</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-log4j2</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.kafka</groupId> 
     <artifactId>kafka-log4j-appender</artifactId> 
     <version>0.10.0.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-log4j12</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.6</version> 
    </dependency> 
</dependencies> 

私は、XMLを作成しlog4j2.xml形式のファイル

{ 
    "timeMillis": 1485736022854, 
    "thread": "Thread-1", 
    "level": "INFO", 
    "loggerName": "org.springframework.context.annotation.AnnotationConfigApplicationContext", 
    "message": "Closing org.spring[email protected]20140db9: startup date [Sun Jan 29 17:26:52 MST 2017]; root of context hierarchy", 
    "endOfBatch": false, 
    "loggerFqcn": "org.apache.commons.logging.impl.SLF4JLocationAwareLog", 
    "threadId": 19, 
    "threadPriority": 5 
} 
関連する問題