/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package jhydra.core.logging; /** * * @author jantic */ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.PatternLayout; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; import ch.qos.logback.core.rolling.RollingFileAppender; import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy; import java.io.File; import java.net.URI; import jhydra.core.config.IRuntimeConfig; import jhydra.core.exceptions.FatalException; import org.slf4j.LoggerFactory; public class Log implements ILog{ private final URI logDirectory; private final Logger logger; //For project specific logging public Log(IRuntimeConfig config) throws FatalException{ logDirectory = config.getLogsDirectory(); logger = getLogger(); } private Logger getLogger() throws LogDirectoryCreationException{ establishLogDirectory(); return getConfiguredLogger(); } private void establishLogDirectory() throws LogDirectoryCreationException{ final File file = new File(logDirectory); try{ if (!file.isDirectory()){ //noinspection ResultOfMethodCallIgnored file.mkdirs(); } } catch(Exception e){ throw new LogDirectoryCreationException(file.getPath(), e); } } private Logger getConfiguredLogger(){ final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); final RollingFileAppender<ILoggingEvent> appender = getAppender(loggerContext); final Logger logbackLogger = loggerContext.getLogger(Log.class); logbackLogger.addAppender(appender); logbackLogger.setLevel(Level.DEBUG); logbackLogger.setAdditive(true); return logbackLogger; } private RollingFileAppender<ILoggingEvent> getAppender(LoggerContext loggerContext){ final RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>(); appender.setContext(loggerContext); final String logPath = getLogPath(); appender.setFile(logPath); appender.setAppend(true); final FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy(); rollingPolicy.setContext(loggerContext); rollingPolicy.setParent(appender); rollingPolicy.setMaxIndex(10); rollingPolicy.setFileNamePattern("rolling-log.%i.log"); rollingPolicy.start(); appender.setRollingPolicy(rollingPolicy); final SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = new SizeBasedTriggeringPolicy<>(); triggeringPolicy.setContext(loggerContext); triggeringPolicy.setMaxFileSize("30MB"); triggeringPolicy.start(); appender.setTriggeringPolicy(triggeringPolicy); final String conversionPattern = "%date [%thread] %-5level - %message%n%ex%n"; final PatternLayout layout = new PatternLayout(); layout.setContext(loggerContext); layout.setPattern(conversionPattern); layout.setPresentationHeader(System.lineSeparator() + System.lineSeparator() + "[Header]" + System.lineSeparator()); layout.setPresentationFooter("[Footer]" + System.lineSeparator()); layout.start(); appender.setLayout(layout); appender.start(); return appender; } private String getLogPath(){ final String logFileName = "rolling-log.log"; return logDirectory.getPath() + "/" + logFileName; } @Override public void debug(String message, Exception exception) { logger.debug(message, exception); } @Override public void debug(String message) { logger.debug(message); } @Override public void error(String message, Exception exception) { logger.error(message, exception); } @Override public void error(String message) { logger.error(message); } @Override public void info(String message, Exception exception) { logger.info(message, exception); } @Override public void info(String message) { logger.info(message); } @Override public void warn(String message, Exception exception) { logger.warn(message, exception); } @Override public void warn(String message) { logger.warn(message); } }