package org.slf4j.impl;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Properties;

import org.slf4j.helpers.Util;
import org.slf4j.impl.OutputChoice.OutputChoiceType;

This class holds configuration values for SimpleLogger. The values are computed at runtime. See SimpleLogger documentation for more information.
Author:Ceki Gülcü, Scott Sanders, Rod Waldhoff, Robert Burrell Donkin, Cédrik LIME
Since:1.7.25
/** * This class holds configuration values for {@link SimpleLogger}. The * values are computed at runtime. See {@link SimpleLogger} documentation for * more information. * * * @author Ceki Gülcü * @author Scott Sanders * @author Rod Waldhoff * @author Robert Burrell Donkin * @author Cédrik LIME * * @since 1.7.25 */
public class SimpleLoggerConfiguration { private static final String CONFIGURATION_FILE = "simplelogger.properties"; static int DEFAULT_LOG_LEVEL_DEFAULT = SimpleLogger.LOG_LEVEL_INFO; int defaultLogLevel = DEFAULT_LOG_LEVEL_DEFAULT; private static final boolean SHOW_DATE_TIME_DEFAULT = false; boolean showDateTime = SHOW_DATE_TIME_DEFAULT; private static final String DATE_TIME_FORMAT_STR_DEFAULT = null; private static String dateTimeFormatStr = DATE_TIME_FORMAT_STR_DEFAULT; DateFormat dateFormatter = null; private static final boolean SHOW_THREAD_NAME_DEFAULT = true; boolean showThreadName = SHOW_THREAD_NAME_DEFAULT; final static boolean SHOW_LOG_NAME_DEFAULT = true; boolean showLogName = SHOW_LOG_NAME_DEFAULT; private static final boolean SHOW_SHORT_LOG_NAME_DEFAULT = false; boolean showShortLogName = SHOW_SHORT_LOG_NAME_DEFAULT; private static final boolean LEVEL_IN_BRACKETS_DEFAULT = false; boolean levelInBrackets = LEVEL_IN_BRACKETS_DEFAULT; private static String LOG_FILE_DEFAULT = "System.err"; private String logFile = LOG_FILE_DEFAULT; OutputChoice outputChoice = null; private static final boolean CACHE_OUTPUT_STREAM_DEFAULT = false; private boolean cacheOutputStream = CACHE_OUTPUT_STREAM_DEFAULT; private static final String WARN_LEVELS_STRING_DEFAULT = "WARN"; String warnLevelString = WARN_LEVELS_STRING_DEFAULT; private final Properties properties = new Properties(); void init() { loadProperties(); String defaultLogLevelString = getStringProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, null); if (defaultLogLevelString != null) defaultLogLevel = stringToLevel(defaultLogLevelString); showLogName = getBooleanProperty(SimpleLogger.SHOW_LOG_NAME_KEY, SimpleLoggerConfiguration.SHOW_LOG_NAME_DEFAULT); showShortLogName = getBooleanProperty(SimpleLogger.SHOW_SHORT_LOG_NAME_KEY, SHOW_SHORT_LOG_NAME_DEFAULT); showDateTime = getBooleanProperty(SimpleLogger.SHOW_DATE_TIME_KEY, SHOW_DATE_TIME_DEFAULT); showThreadName = getBooleanProperty(SimpleLogger.SHOW_THREAD_NAME_KEY, SHOW_THREAD_NAME_DEFAULT); dateTimeFormatStr = getStringProperty(SimpleLogger.DATE_TIME_FORMAT_KEY, DATE_TIME_FORMAT_STR_DEFAULT); levelInBrackets = getBooleanProperty(SimpleLogger.LEVEL_IN_BRACKETS_KEY, LEVEL_IN_BRACKETS_DEFAULT); warnLevelString = getStringProperty(SimpleLogger.WARN_LEVEL_STRING_KEY, WARN_LEVELS_STRING_DEFAULT); logFile = getStringProperty(SimpleLogger.LOG_FILE_KEY, logFile); cacheOutputStream = getBooleanProperty(SimpleLogger.CACHE_OUTPUT_STREAM_STRING_KEY, CACHE_OUTPUT_STREAM_DEFAULT); outputChoice = computeOutputChoice(logFile, cacheOutputStream); if (dateTimeFormatStr != null) { try { dateFormatter = new SimpleDateFormat(dateTimeFormatStr); } catch (IllegalArgumentException e) { Util.report("Bad date format in " + CONFIGURATION_FILE + "; will output relative time", e); } } } private void loadProperties() { // Add props from the resource simplelogger.properties InputStream in = AccessController.doPrivileged(new PrivilegedAction<InputStream>() { public InputStream run() { ClassLoader threadCL = Thread.currentThread().getContextClassLoader(); if (threadCL != null) { return threadCL.getResourceAsStream(CONFIGURATION_FILE); } else { return ClassLoader.getSystemResourceAsStream(CONFIGURATION_FILE); } } }); if (null != in) { try { properties.load(in); } catch (java.io.IOException e) { // ignored } finally { try { in.close(); } catch (java.io.IOException e) { // ignored } } } } String getStringProperty(String name, String defaultValue) { String prop = getStringProperty(name); return (prop == null) ? defaultValue : prop; } boolean getBooleanProperty(String name, boolean defaultValue) { String prop = getStringProperty(name); return (prop == null) ? defaultValue : "true".equalsIgnoreCase(prop); } String getStringProperty(String name) { String prop = null; try { prop = System.getProperty(name); } catch (SecurityException e) { ; // Ignore } return (prop == null) ? properties.getProperty(name) : prop; } static int stringToLevel(String levelStr) { if ("trace".equalsIgnoreCase(levelStr)) { return SimpleLogger.LOG_LEVEL_TRACE; } else if ("debug".equalsIgnoreCase(levelStr)) { return SimpleLogger.LOG_LEVEL_DEBUG; } else if ("info".equalsIgnoreCase(levelStr)) { return SimpleLogger.LOG_LEVEL_INFO; } else if ("warn".equalsIgnoreCase(levelStr)) { return SimpleLogger.LOG_LEVEL_WARN; } else if ("error".equalsIgnoreCase(levelStr)) { return SimpleLogger.LOG_LEVEL_ERROR; } else if ("off".equalsIgnoreCase(levelStr)) { return SimpleLogger.LOG_LEVEL_OFF; } // assume INFO by default return SimpleLogger.LOG_LEVEL_INFO; } private static OutputChoice computeOutputChoice(String logFile, boolean cacheOutputStream) { if ("System.err".equalsIgnoreCase(logFile)) if (cacheOutputStream) return new OutputChoice(OutputChoiceType.CACHED_SYS_ERR); else return new OutputChoice(OutputChoiceType.SYS_ERR); else if ("System.out".equalsIgnoreCase(logFile)) { if (cacheOutputStream) return new OutputChoice(OutputChoiceType.CACHED_SYS_OUT); else return new OutputChoice(OutputChoiceType.SYS_OUT); } else { try { FileOutputStream fos = new FileOutputStream(logFile); PrintStream printStream = new PrintStream(fos); return new OutputChoice(printStream); } catch (FileNotFoundException e) { Util.report("Could not open [" + logFile + "]. Defaulting to System.err", e); return new OutputChoice(OutputChoiceType.SYS_ERR); } } } }