/* * Copyright © 2014-2016 Cask Data, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package co.cask.cdap.logging.appender.kafka; import co.cask.cdap.common.conf.CConfiguration; import co.cask.cdap.logging.appender.LogAppender; import co.cask.cdap.logging.appender.LogMessage; import com.google.common.base.Throwables; import com.google.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; /** * Log appender that publishes log messages to Kafka. */ public final class KafkaLogAppender extends LogAppender { private static final Logger LOG = LoggerFactory.getLogger(KafkaLogAppender.class); private static final String APPENDER_NAME = "KafkaLogAppender"; private final SimpleKafkaProducer producer; private final LoggingEventSerializer loggingEventSerializer; private final AtomicBoolean stopped = new AtomicBoolean(false); @Inject KafkaLogAppender(CConfiguration cConf) { setName(APPENDER_NAME); addInfo("Initializing KafkaLogAppender..."); this.producer = new SimpleKafkaProducer(cConf); try { this.loggingEventSerializer = new LoggingEventSerializer(); } catch (IOException e) { addError("Error initializing KafkaLogAppender.", e); throw Throwables.propagate(e); } addInfo("Successfully initialized KafkaLogAppender."); } @Override protected void append(LogMessage logMessage) { try { byte [] bytes = loggingEventSerializer.toBytes(logMessage.getLoggingEvent(), logMessage.getLoggingContext()); producer.publish(logMessage.getLoggingContext().getLogPartition(), bytes); } catch (Throwable t) { LOG.error("Got exception while serializing log event {}.", logMessage.getLoggingEvent(), t); } } @Override public void stop() { if (!stopped.compareAndSet(false, true)) { return; } super.stop(); producer.stop(); } }