package org.embulk.exec;
import org.slf4j.ILoggerFactory;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import org.embulk.config.ConfigSource;
public class LoggerProvider
implements Provider<ILoggerFactory>
{
@Inject
public LoggerProvider(@ForSystemConfig ConfigSource systemConfig)
{
final String level;
String logLevel = systemConfig.get(String.class, "log_level", "info"); // here can't use loadConfig because ModelManager uses LoggerProvider
switch (logLevel) {
case "error": level = "ERROR"; break;
case "warn": level = "WARN"; break;
case "info": level = "INFO"; break;
case "debug": level = "DEBUG"; break;
case "trace": level = "TRACE"; break;
default:
throw new IllegalArgumentException(String.format(
"System property embulk.logLevel=%s is invalid. Available levels are error, warn, info, debug and trace.", logLevel));
}
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
context.reset();
String logPath = systemConfig.get(String.class, "log_path", "-");
String name;
if (logPath.equals("-")) {
if (System.console() != null) {
name = "/embulk/logback-color.xml";
} else {
name = "/embulk/logback-console.xml";
}
} else {
// logback uses system property to embed variables in XML file
System.setProperty("embulk.logPath", logPath);
name = "/embulk/logback-file.xml";
}
try {
configurator.doConfigure(getClass().getResource(name));
} catch (JoranException ex) {
throw new RuntimeException(ex);
}
org.slf4j.Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
if (logger instanceof Logger) {
((Logger) logger).setLevel(Level.toLevel(level.toUpperCase(), Level.DEBUG));
}
}
public ILoggerFactory get()
{
return LoggerFactory.getILoggerFactory();
}
}