package eu.europeana.cloud.service.commons.logging;
import kafka.producer.KafkaLog4jAppender;
import org.apache.log4j.Appender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jndi.JndiTemplate;
import javax.annotation.PostConstruct;
import javax.naming.NamingException;
import java.util.Enumeration;
/**
*
* Inserts unique instance name into log message based on machine hostname;<br/>
*
*/
public class SimpleLoggingConfigurator extends LoggingConfigurator {
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(SimpleLoggingConfigurator.class);
private static final String EUROPEANA_CLOUD_LOGGER_NAME ="eu.europeana.cloud.service.commons.logging.LoggingFilter";
private static final String KAFKA_APPENDER_NAME = "KAFKA";
private static final String KAFKA_BROKER_LIST_JNDI_NAME = "java:comp/env/logging/kafka/brokerList";
@Override
@PostConstruct
public void configure() {
LOGGER.info("Start configuring logging system");
String hostname = readHostname(null);
configureKafkaLogger(hostname);
configureRootLogger(hostname);
LOGGER.info("Logging system configuration finished");
}
private void configureKafkaLogger(String hostname) {
Logger europeanaLogger = Logger.getLogger(EUROPEANA_CLOUD_LOGGER_NAME);
try{
if(isKafkaAppenderDefined(europeanaLogger)){
configureKafkaAppender(europeanaLogger);
}
}catch(NamingException ex){
removeKafkaAppenderFromLogger(europeanaLogger);
LOGGER.error("Name " +KAFKA_BROKER_LIST_JNDI_NAME +" not found in JNDI.");
}
turnOnLogger(europeanaLogger);
loggerUpdater.update(europeanaLogger, APPLICATION_INSTANCE_NAME_MARKER, hostname);
}
private void configureRootLogger(String hostname) {
Logger applicationRootLogger = Logger.getRootLogger();
loggerUpdater.update(applicationRootLogger, APPLICATION_INSTANCE_NAME_MARKER, hostname);
}
private boolean isKafkaAppenderDefined(Logger logger) {
if (logger != null) {
Appender kafkaAppender = logger.getAppender(KAFKA_APPENDER_NAME);
if (kafkaAppender != null) {
return true;
} else {
return false;
}
}else{
return false;
}
}
private void configureKafkaAppender(Logger logger) throws NamingException {
Enumeration<Appender> appenderEnumerator = logger.getAllAppenders();
while (appenderEnumerator.hasMoreElements()) {
Appender appender = appenderEnumerator.nextElement();
if(appender instanceof KafkaLog4jAppender){
KafkaLog4jAppender kafkaAppender = (KafkaLog4jAppender)appender;
String brokerList = readKafkaBrokerListFromJNDI();
kafkaAppender.setBrokerList(brokerList);
kafkaAppender.activateOptions();
}
}
}
private String readKafkaBrokerListFromJNDI() throws NamingException {
JndiTemplate jndi = new JndiTemplate();
return jndi.lookup(KAFKA_BROKER_LIST_JNDI_NAME).toString();
}
private void removeKafkaAppenderFromLogger(Logger logger) {
logger.removeAppender(KAFKA_APPENDER_NAME);
}
private void turnOnLogger(Logger logger) {
logger.setLevel(Level.INFO);
}
}