/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.logging.log4j.simple;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.apache.logging.log4j.spi.LoggerContext;
import org.apache.logging.log4j.spi.LoggerRegistry;
import org.apache.logging.log4j.util.PropertiesUtil;

/**
 *
 */
public class SimpleLoggerContext implements LoggerContext {

    private static final String SYSTEM_OUT = "system.out";

    private static final String SYSTEM_ERR = "system.err";

    
The default format to use when formatting dates
/** The default format to use when formatting dates */
protected static final String DEFAULT_DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss:SSS zzz";
All system properties used by SimpleLog start with this
/** All system properties used by <code>SimpleLog</code> start with this */
protected static final String SYSTEM_PREFIX = "org.apache.logging.log4j.simplelog."; private final PropertiesUtil props;
Include the instance name in the log message?
/** Include the instance name in the log message? */
private final boolean showLogName;
Include the short name (last component) of the logger in the log message. Defaults to true - otherwise we'll be lost in a flood of messages without knowing who sends them.
/** * Include the short name (last component) of the logger in the log message. Defaults to true - otherwise we'll be * lost in a flood of messages without knowing who sends them. */
private final boolean showShortName;
Include the current time in the log message
/** Include the current time in the log message */
private final boolean showDateTime;
Include the ThreadContextMap in the log message
/** Include the ThreadContextMap in the log message */
private final boolean showContextMap;
The date and time format to use in the log message
/** The date and time format to use in the log message */
private final String dateTimeFormat; private final Level defaultLevel; private final PrintStream stream; private final LoggerRegistry<ExtendedLogger> loggerRegistry = new LoggerRegistry<>(); public SimpleLoggerContext() { props = new PropertiesUtil("log4j2.simplelog.properties"); showContextMap = props.getBooleanProperty(SYSTEM_PREFIX + "showContextMap", false); showLogName = props.getBooleanProperty(SYSTEM_PREFIX + "showlogname", false); showShortName = props.getBooleanProperty(SYSTEM_PREFIX + "showShortLogname", true); showDateTime = props.getBooleanProperty(SYSTEM_PREFIX + "showdatetime", false); final String lvl = props.getStringProperty(SYSTEM_PREFIX + "level"); defaultLevel = Level.toLevel(lvl, Level.ERROR); dateTimeFormat = showDateTime ? props.getStringProperty(SimpleLoggerContext.SYSTEM_PREFIX + "dateTimeFormat", DEFAULT_DATE_TIME_FORMAT) : null; final String fileName = props.getStringProperty(SYSTEM_PREFIX + "logFile", SYSTEM_ERR); PrintStream ps; if (SYSTEM_ERR.equalsIgnoreCase(fileName)) { ps = System.err; } else if (SYSTEM_OUT.equalsIgnoreCase(fileName)) { ps = System.out; } else { try { final FileOutputStream os = new FileOutputStream(fileName); ps = new PrintStream(os); } catch (final FileNotFoundException fnfe) { ps = System.err; } } this.stream = ps; } @Override public ExtendedLogger getLogger(final String name) { return getLogger(name, null); } @Override public ExtendedLogger getLogger(final String name, final MessageFactory messageFactory) { // Note: This is the only method where we add entries to the 'loggerRegistry' ivar. final ExtendedLogger extendedLogger = loggerRegistry.getLogger(name, messageFactory); if (extendedLogger != null) { AbstractLogger.checkMessageFactory(extendedLogger, messageFactory); return extendedLogger; } final SimpleLogger simpleLogger = new SimpleLogger(name, defaultLevel, showLogName, showShortName, showDateTime, showContextMap, dateTimeFormat, messageFactory, props, stream); loggerRegistry.putIfAbsent(name, messageFactory, simpleLogger); return loggerRegistry.getLogger(name, messageFactory); } @Override public boolean hasLogger(final String name) { return false; } @Override public boolean hasLogger(final String name, final MessageFactory messageFactory) { return false; } @Override public boolean hasLogger(final String name, final Class<? extends MessageFactory> messageFactoryClass) { return false; } @Override public Object getExternalContext() { return null; } }