/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package net.acesinc.data.json.generator.log; import java.io.IOException; import java.util.Map; import java.util.Properties; import java.util.concurrent.ExecutionException; import net.acesinc.data.json.util.JsonUtils; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.StringSerializer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * * @author andrewserff */ public class KafkaLogger implements EventLogger { private static final Logger log = LogManager.getLogger(KafkaLogger.class); public static final String BROKER_SERVER_PROP_NAME = "broker.server"; public static final String BROKER_PORT_PROP_NAME = "broker.port"; private final KafkaProducer<String, String> producer; private final String topic; private final boolean sync; private final boolean flatten; private final Properties props = new Properties(); private JsonUtils jsonUtils; public KafkaLogger(Map<String, Object> props) { String brokerHost = (String) props.get(BROKER_SERVER_PROP_NAME); Integer brokerPort = (Integer) props.get(BROKER_PORT_PROP_NAME); this.props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,brokerHost + ":" + brokerPort.toString()); this.props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName()); this.props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName()); producer = new KafkaProducer<>(this.props); this.topic = (String) props.get("topic"); if (props.get("sync") != null) { this.sync = (Boolean) props.get("sync"); } else { this.sync = false; } if (props.get("flatten") != null) { this.flatten = (Boolean) props.get("flatten"); } else { this.flatten = false; } this.jsonUtils = new JsonUtils(); } @Override public void logEvent(String event, Map<String, Object> producerConfig) { logEvent(event); } private void logEvent(String event) { boolean sync = false; String output = event; if (flatten) { try { output = jsonUtils.flattenJson(event); } catch (IOException ex) { log.error("Error flattening json. Unable to send event [ " + event + " ]", ex); return; } } ProducerRecord<String, String> producerRecord = new ProducerRecord<>(topic, output); if (sync) { try { producer.send(producerRecord).get(); } catch (InterruptedException | ExecutionException ex) { //got interrupted while waiting log.warn("Thread interrupted while waiting for synchronous response from producer", ex); } } else { log.debug("Sending event to Kafka: [ " + output + " ]"); producer.send(producerRecord); } } @Override public void shutdown() { producer.close(); } }