package org.myrobotlab.logging;
import java.io.File;
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.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.util.StatusPrinter;
public class LoggingSLF4J extends Logging {
@Override
public void addAppender(Object type) {
// BIG NOOP
}
@Override
public void addAppender(String type) {
addAppender(type, null);
}
@Override
public void addAppender(String type, String filename) {
// OutputStreamAppender<E>
// ConsoleAppender, FileAppender
// OutputStreamAppender<ILoggingEvent> appender = null;
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
PatternLayoutEncoder ple = new PatternLayoutEncoder();
// %date
ple.setPattern("%date{HH:mm:ss.SSS} [%thread] %level %logger{10} [%file:%line] %msg%n");
ple.setContext(lc);
ple.start();
// allows you to add appenders to different logging locations
Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
logger.setAdditive(false);
// TODO - do layout ???
if (Appender.CONSOLE.equalsIgnoreCase(type)) {
ConsoleAppender<ILoggingEvent> console = new ConsoleAppender<ILoggingEvent>();
console.setName(type);
// console.setLayout(layout); ???
console.setEncoder(ple);
console.setContext(lc);
console.start();
logger.addAppender(console);
} else if (Appender.FILE.equalsIgnoreCase(type)) {
FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
fileAppender.setName(type);
fileAppender.setFile(LoggingFactory.getLogFileName());
fileAppender.setEncoder(ple);
fileAppender.setContext(lc);
fileAppender.start();
logger.addAppender(fileAppender);
} else if (Appender.IS_AGENT.equalsIgnoreCase(type)) {
// FROM_AGENT has only console - Agent has both console & file
// appender
/*
* appender = new ConsoleAppender(layout); appender = new
* RollingFileAppender(layout, String.format("%s%smyrobotlab.log",
* System.getProperty("user.dir"), File.separator), false);
* appender.setName(type); appenders.add(Appender.IS_AGENT);
*/
// console
ConsoleAppender<ILoggingEvent> console = new ConsoleAppender<ILoggingEvent>();
console.setName(String.format("%s.%s", Appender.IS_AGENT, Appender.CONSOLE));
// console.setLayout(layout); ???
console.setEncoder(ple);
console.setContext(lc);
logger.addAppender(console);
// file
FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
fileAppender.setName(String.format("%s.%s", Appender.IS_AGENT, Appender.FILE));
fileAppender.setFile(String.format("%s%smyrobotlab.log", System.getProperty("user.dir"), File.separator));
fileAppender.setEncoder(ple);
fileAppender.setContext(lc);
fileAppender.start();
// logger.addAppender(console); // THIS IS NEW ! PREVIOUSLY A BUG
// PREVENTED THIS ..
// going to keep it shutdown - so as not to not do too much logging
logger.addAppender(fileAppender);
} else if (Appender.FROM_AGENT.equalsIgnoreCase(type)) {
// only has console because the console is relayed to the Agent
// shorter layout than Agent - since everything will be
// prepended to Agent's log prefix
// layout = new PatternLayout("[%t] %-5p %c %x - %m%n");
// TODO - add Pid or runtime Name ! process index ?
// layout = new PatternLayout("[%t] %-5p %c %x - %m%n"); SHORT
// PATTERN ???
// appender = new RollingFileAppender(layout,
// String.format("%s%agent.log", System.getProperty("user.dir"),
// File.separator), false);
// console
ConsoleAppender<ILoggingEvent> console = new ConsoleAppender<ILoggingEvent>();
console.setName(String.format("%s.%s", Appender.FROM_AGENT, Appender.CONSOLE));
// console.setLayout(layout); ???
console.setEncoder(ple);
console.setContext(lc);
logger.addAppender(console);
} else {
log.error(String.format("attempting to add unkown type of Appender %1$s", type));
return;
}
}
@Override
public void configure() {
// LoggerFactory.getILoggerFactory();
// BasicConfigurator.configureDefaultContext();
// http://www.mkyong.com/logging/logback-duplicate-log-messages/
// BasicConfigurator.configureDefaultContext();
// LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
// BasicConfigurator.configure(lc);
// BasicConfigurator.configure(null);
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
StatusPrinter.printInCaseOfErrorsOrWarnings(context);
}
@Override
public String getLevel() {
/*
* Map<String,String> levels=newTreeMap(); LoggerContext
* context=(LoggerContext)LoggerFactory.getILoggerFactory(); for ( Logger
* logger : context.getLoggerList()) { if (logger.getLevel() != null) {
* levels.put(logger.getName(),logger.getLevel().toString()); } }
*/
Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
Level level = logger.getLevel();
if (level.equals(Level.DEBUG)) {
return "DEBUG";
} else if (level.equals(Level.INFO)) {
return "INFO";
} else if (level.equals(Level.WARN)) {
return "WARN";
} else if (level.equals(Level.ERROR)) {
return "ERROR";
}
return "UNKNOWN";
}
@Override
public void removeAllAppenders() {
Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
logger.detachAndStopAllAppenders();
}
@Override
public void removeAppender(Object console) {
// Another big NOOP
}
@Override
public void removeAppender(String name) {
Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
logger.detachAppender(name); // does this stop it too ?
}
@Override
public void setLevel(String level) {
setLevel(null, level);
}
@Override
public void setLevel(String clazz, String level) {
if (clazz == null || clazz.length() == 0) {
clazz = Logger.ROOT_LOGGER_NAME;
}
Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
if ("DEBUG".equalsIgnoreCase(level)) { // && log4j {
logger.setLevel(Level.DEBUG);
} else if ("TRACE".equalsIgnoreCase(level)) { // && log4j {
logger.setLevel(Level.TRACE);
} else if ("WARN".equalsIgnoreCase(level)) { // && log4j {
logger.setLevel(Level.WARN);
} else if ("ERROR".equalsIgnoreCase(level)) { // && log4j {
logger.setLevel(Level.ERROR);
// } else if ("FATAL".equalsIgnoreCase(level)) { // && log4j {
// logger.setLevel(Level.FATAL);
} else { // && log4j {
logger.setLevel(Level.INFO);
}
}
}