All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sangupta.jerry.ApplicationLogger Maven / Gradle / Ivy

/**
 *
 * jerry - Common Java Functionality
 * Copyright (c) 2012-2016, Sandeep Gupta
 *
 * http://sangupta.com/projects/jerry-core
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.sangupta.jerry;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.LoggerFactory;

import com.sangupta.jerry.util.AssertUtils;

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.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.encoder.Encoder;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;

/**
 * Centralized logback based application logger that helps us initialize
 * logging via Java. It also helps in changing log-levels dynamically as
 * and when needed.
 * 
 * @author sangupta
 *
 */
public class ApplicationLogger {
	
	private static final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

	private static final Map> registeredAppenders = new HashMap<>();
	
	private static volatile boolean loggerInitialized = false;
	
	private static Level defaultLogLevel = Level.DEBUG;
	
	public static void setDefaultLogLevel(Level level) {
		if(level == null) {
			throw new IllegalArgumentException("Log level cannot be null");
		}
		
		defaultLogLevel = level;
	}
	
	private static Encoder getPatternLayoutEncoder(String logPattern) {
        PatternLayoutEncoder patternLayoutEncoder = new PatternLayoutEncoder();
        patternLayoutEncoder.setPattern(logPattern);
        patternLayoutEncoder.setContext(loggerContext);
        patternLayoutEncoder.setOutputPatternAsHeader(true);
        patternLayoutEncoder.start();

        return patternLayoutEncoder;
	}
	
	public static void addConsoleAppender(String name, String logPattern) {
		ConsoleAppender consoleAppender = new ConsoleAppender<>();
        consoleAppender.setEncoder(getPatternLayoutEncoder(logPattern));
        consoleAppender.setContext(loggerContext);
        consoleAppender.setName(name);
        consoleAppender.start();
        
        registeredAppenders.put(name, consoleAppender);
	}
	
	public static void addFileAppender(String name, String logPattern, String filePath, int maxHistory) {
		RollingFileAppender fileAppender = new RollingFileAppender();
        fileAppender.setFile(filePath);
        fileAppender.setEncoder(getPatternLayoutEncoder(logPattern));
        fileAppender.setContext(loggerContext);
        fileAppender.setName(name);
        fileAppender.setAppend(true);
        
        // time based rolling policy
        TimeBasedRollingPolicy logFilePolicy = new TimeBasedRollingPolicy<>();
	    logFilePolicy.setContext(loggerContext);
	    logFilePolicy.setParent(fileAppender);
	    logFilePolicy.setFileNamePattern(getDateBasedFileName(filePath));
	    logFilePolicy.setMaxHistory(50);
	    logFilePolicy.start();
	    
	    fileAppender.setRollingPolicy(logFilePolicy);
        fileAppender.start();

        registeredAppenders.put(name, fileAppender);
	}
	
	public static void registerRootLogger() {
		registerRootLogger(Level.INFO);
	}
	
	public static synchronized void registerRootLogger(Level rootLoggerLevel) {
		if(loggerInitialized) {
			return;
		}
		
		loggerInitialized = true;
		
        Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        rootLogger.setLevel(rootLoggerLevel);
        addLogger(rootLogger, rootLoggerLevel, null);
	}
	
    public static Logger addLogger(String loggingClass) {
        return addLogger(loggingClass, (String) null);
    }
    
    public static Logger addLogger(String loggingClass, String appenderName) {
        Logger logger = (Logger) LoggerFactory.getLogger(loggingClass);
        return addLogger(logger, defaultLogLevel, appenderName);
    }
    
    public static Logger addLogger(String loggingClass, Level logLevel) {
    	return addLogger(loggingClass, logLevel, null);
    }
    
    public static Logger addLogger(String loggingClass, Level logLevel, String appenderName) {
    	if(AssertUtils.isEmpty(loggingClass)) {
    		return null;
    	}
    	
    	Logger logger = (Logger) LoggerFactory.getLogger(loggingClass);
    	return addLogger(logger, logLevel, null);
    }
    
    private static Logger addLogger(Logger logger, Level logLevel, String appenderName) {
    	if(AssertUtils.isNotEmpty(appenderName)) {
    		Appender appender = registeredAppenders.get(appenderName);
    		if(appender == null) {
    			return null;
    		}
    		
    		logger.addAppender(appender);
    	} else {
    		for(Appender appender : registeredAppenders.values()) {
    			logger.addAppender(appender);
    		}
    	}
    	
    	logger.setLevel(logLevel);
        logger.setAdditive(false);
        
        return logger;
	}
	
	/**
	 * @param filePath
	 * @return
	 */
	private static String getDateBasedFileName(String filePath) {
		return filePath + "-%d{yyyy-MM-dd_HH}.log";
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy