/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying * information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Portions Copyright 2006 Sun Microsystems, Inc.
*/
package org.opends.server.loggers;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.StringTokenizer;
import org.opends.server.api.ErrorLogger;
import org.opends.server.config.ConfigEntry;
import org.opends.server.types.ErrorLogCategory;
import org.opends.server.types.ErrorLogSeverity;
import org.opends.server.util.TimeThread;
/**
* This class defines a Directory Server error logger that will be used only
* during startup. It makes it possible for informational, warning, and error
* messages to be generated during startup and made available to the user for
* things that happen before the configuration can be parsed and all of the
* actual error loggers instantiated and registered. This error logger will be
* taken out of service once the startup is complete.
*
* By default, fatal errors, severe errors, severe warnings, and important
* information will be logged. This can be modified on a per-category basis
* using a "DS_ERROR_LEVEL" environment variable that should be a
* semicolon-delimited list in which each element in that list should contain
* the name of the category, an equal sign, and a comma-delimited list of the
* severity levels to use for that category.
*/
public class StartupErrorLogger
extends ErrorLogger
{
/**
* The name of the environment variable that may be used to alter the kinds of
* messages that get logged with this startup error logger.
*/
public static final String ENV_VARIABLE_ERROR_LOG_LEVEL = "DS_ERROR_LEVEL";
// The hash map that will be used to define specific log severities for the
// various categories.
private HashMap> definedSeverities;
// The set of default log severities that will be used if no custom severities
// have been defined for the associated category.
private HashSet defaultSeverities;
// The writer that will be used to actually write the messages.
private PrintWriter writer;
/**
* Creates a new instance of this startup error logger. It does not actually
* do anything, since all initialization is performed in the
* initializeErrorLogger method.
*/
public StartupErrorLogger()
{
super();
}
/**
* Initializes this error logger based on the information in the provided
* configuration entry.
*
* @param configEntry The configuration entry that contains the information
* to use to initialize this error logger.
*/
public void initializeErrorLogger(ConfigEntry configEntry)
{
writer = new PrintWriter(System.err, true);
defaultSeverities = new HashSet();
defaultSeverities.add(ErrorLogSeverity.FATAL_ERROR);
defaultSeverities.add(ErrorLogSeverity.SEVERE_ERROR);
defaultSeverities.add(ErrorLogSeverity.SEVERE_WARNING);
defaultSeverities.add(ErrorLogSeverity.NOTICE);
definedSeverities =
new HashMap>();
String logLevelInfo = System.getenv(ENV_VARIABLE_ERROR_LOG_LEVEL);
if (logLevelInfo != null)
{
StringTokenizer tokenizer = new StringTokenizer(logLevelInfo, ";");
while (tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
int equalPos = token.indexOf('=');
if (equalPos < 0)
{
writer.println("StartupErrorLogger: Token \"" + token +
"\" read from environment variable " +
ENV_VARIABLE_ERROR_LOG_LEVEL + " does not contain " +
"an equal sign to separate the category from the " +
"severity list. It will be ignored");
continue;
}
String categoryName = token.substring(0, equalPos);
ErrorLogCategory category = ErrorLogCategory.getByName(categoryName);
if (category == null)
{
writer.println("StartupErrorLogger: Unknown error log category \"" +
categoryName + "\" read from environment variable " +
ENV_VARIABLE_ERROR_LOG_LEVEL + " will be ignored.");
continue;
}
HashSet severities = new HashSet();
StringTokenizer sevTokenizer =
new StringTokenizer(token.substring(equalPos+1), ",");
while (sevTokenizer.hasMoreElements())
{
String severityName = sevTokenizer.nextToken();
ErrorLogSeverity severity = ErrorLogSeverity.getByName(severityName);
if (severity == null)
{
writer.println("StartupErrorLogger: Unknown error log severity " +
"\"" + severityName + "\" read from environment " +
"variable " + ENV_VARIABLE_ERROR_LOG_LEVEL +
" will be ignored.");
continue;
}
else
{
severities.add(severity);
}
}
definedSeverities.put(category, severities);
}
}
}
/**
* Closes this error logger and releases any resources it might have held.
*/
public void closeErrorLogger()
{
// No action is required, and this logger will remain usable.
}
/**
* Writes a message to the error log using the provided information.
*
* @param category The category that may be used to determine whether to
* actually log this message.
* @param severity The severity that may be used to determine whether to
* actually log this message.
* @param message The message to be logged.
* @param errorID The error ID that uniquely identifies the format string
* used to generate the provided message.
*/
public void logError(ErrorLogCategory category, ErrorLogSeverity severity,
String message, int errorID)
{
HashSet severities = definedSeverities.get(category);
if (severities == null)
{
severities = defaultSeverities;
}
if (severities.contains(severity))
{
StringBuilder logMsg = new StringBuilder();
logMsg.append('[');
logMsg.append(TimeThread.getLocalTime());
logMsg.append("] category=");
logMsg.append(category.getCategoryName());
logMsg.append(" severity=");
logMsg.append(severity.getSeverityName());
logMsg.append(" id=");
logMsg.append(errorID);
logMsg.append(" msg=\"");
logMsg.append(message);
logMsg.append("\"");
writer.println(logMsg.toString());
}
}
/**
* Indicates whether the provided object is equal to this error logger.
*
* @param o The object for which to make the determination.
*
* @return true if the provided object is determined to be equal
* to this error logger, or false if not.
*/
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if ((o == null) || (! (o instanceof StartupErrorLogger)))
{
return false;
}
return true;
}
/**
* Retrieves the hash code for this error logger.
*
* @return The hash code for this error logger.
*/
public int hashCode()
{
// Just make one up, since there should never be a need to have more than
// one instance of this error logger.
return 12345;
}
}