a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2008 Sun Microsystems Inc. All Rights Reserved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the License). You may not use this file except in
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * compliance with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the License at
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * opensso/legal/CDDLv1.0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * permission and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Header Notice in each file and include the License file
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * at opensso/legal/CDDLv1.0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below the CDDL Header,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the fields enclosed by brackets [] replaced by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * your own identifying information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * $Id: FedletLogger.java,v 1.3 2008/08/06 17:28:14 exu Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.plugin.log.impl;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.IOException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.net.InetAddress;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.security.AccessController;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.text.MessageFormat;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.debug.Debug;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.configuration.SystemPropertiesManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.log.LogException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Logger;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.LogRecord;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This class is an implementation of the Open Federation Logger interface
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * for Fedlet deployment. The implementation uses JDK logger.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class FedletLogger implements com.sun.identity.plugin.log.Logger {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected Logger accessLogger;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected Logger errorLogger;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Debug debug = Debug.getInstance("libPlugins");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static boolean logStatus = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String status = SystemPropertiesManager.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster com.sun.identity.shared.Constants.AM_LOGSTATUS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logStatus = (status != null) && status.equalsIgnoreCase("ACTIVE");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Initializes the logging for the component.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param componentName the component name.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception LogException if there is an error
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * during initialization.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void init(String componentName) throws LogException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster accessLogger = Logger.getLogger(componentName + ".access");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster errorLogger = Logger.getLogger(componentName + ".error");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Logs message to the access logs.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param level the log level , these are based on those
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * defined in java.util.logging.Level, the values for
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * level can be any one of the following : <br>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <ul>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>SEVERE (highest value)</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>WARNING</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>INFO</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>CONFIG</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>FINE</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>FINER</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>FINEST (lowest value)</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * </ul>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param messageId the message or a message identifier.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param data string array of dynamic data to be replaced in the message.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param session the User's session object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception LogException if there is an error.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void access(Level level,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String messageId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String data[],
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object session
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ) throws LogException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster access(level, messageId, data, session, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Writes access to a component into a log.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param level indicating log level
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param messageId Message id
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param data string array of dynamic data only known during run time
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param session Session object (it could be null)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param props representing log record columns
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception LogException if there is an error.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void access(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Level level,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String messageId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String data[],
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object session,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map props) throws LogException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (isAccessLoggable(level)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogRecord lr = new LogRecord(level,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster formatMessage(messageId, data, session));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster accessLogger.log(lr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String formatMessage(String messageId, String[] param,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object session) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((param == null) || (param.length == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return messageId;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < param.length; i++) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster messageId = messageId + "\n{" + param[i] + "}";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (session != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster messageId = messageId + "\n{" + session.toString() + "}";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return messageId;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Logs error messages to the error logs.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param level the log level , these are based on those
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * defined in java.util.logging.Level, the values for
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * level can be any one of the following : <br>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <ul>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>SEVERE (highest value)</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>WARNING</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>INFO</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>CONFIG</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>FINE</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>FINER</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <li>FINEST (lowest value)</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * </ul>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param messageId the message or a message identifier.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param data string array of dynamic data to be replaced in the message.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param session the User's Session object.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception LogException if there is an error.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void error(Level level, String messageId, String data[],
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object session) throws LogException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster error(level, messageId, data, session, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Writes error occurred in a component into a log.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param level indicating log level
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param messageId Message id
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param data string array of dynamic data only known during run time
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param session Session object (it could be null)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param props log record columns
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception LogException if there is an error.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Level level,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String messageId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String data[],
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object session,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map props) throws LogException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (isErrorLoggable(level)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogRecord lr = new LogRecord(level,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster formatMessage(messageId, data, session));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster errorLogger.log(lr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns <code>true</code> if logging is enabled.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return <code>true</code> if logging is enabled.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public boolean isLogEnabled() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return logStatus;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Checks if an access message of the given level would actually be logged
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * by this logger. This check is based on the Logger's effective level.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param level a message logging level defined in java.util.logging.Level.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return true if the given message level is currently being logged.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public boolean isAccessLoggable(Level level) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return accessLogger.isLoggable(level);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Checks if an error message of the given level would actually be logged
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * by this logger. This check is based on the Logger's effective level.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param level a message logging level defined in java.util.logging.Level.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return true if the given message level is currently being logged.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public boolean isErrorLoggable(Level level) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return errorLogger.isLoggable(level);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}