blob: e13b3365d4f855291073ea136d973148059916a8 [file] [log] [blame]
/*
* Copyright (c) 2016. Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.amazonaws.log;
import com.amazonaws.annotation.ThreadSafe;
/**
* Can be used to configure the default log factory for the AWSJavaClientCore
* and AWSJavaClientSigners. Default to JUL, unless AWSJavaClientRuntime is
* present which will default it to Jakarta Commons Logging.
*/
@ThreadSafe
public abstract class InternalLogFactory {
private static volatile InternalLogFactory factory = new JulLogFactory();
/** True if the log factory has been explicitly configured; false otherwise. */
private static volatile boolean factoryConfigured;
/**
* Returns an SDK logger that logs using the currently configured default
* log factory, given the class.
*/
public static InternalLogApi getLog(Class<?> clazz) {
return factoryConfigured
? factory.doGetLog(clazz)
: new InternalLog(clazz.getName()); // will look up actual logger per log
}
/**
* Returns an SDK logger that logs using the currently configured default
* log factory, given the name.
*/
public static InternalLogApi getLog(String name) {
return factoryConfigured
? factory.doGetLog(name)
: new InternalLog(name); // will look up actual logger per log
}
/**
* SPI to return a logger given a class.
*/
protected abstract InternalLogApi doGetLog(Class<?> clazz);
/**
* SPI to return a logger given a name.
*/
protected abstract InternalLogApi doGetLog(String name);
/**
* Returns the current default log factory.
*/
public static InternalLogFactory getFactory() {
return factory;
}
/**
* Used to explicitly configure the log factory. The log factory can only be
* configured at most once. All subsequent configurations will have no
* effect.
*
* Note explicitly configuring the log factory will have positive
* performance impact on all subsequent logging, since the specific logger
* can be directly referenced instead of being searched every time.
*
* @param factory
* the log factory to be used internally by the SDK
*
* @return true if the log factory is successfully configured; false
* otherwise (ie the log factory is not allowed to be configured
* more than once for performance reasons.)
*/
public synchronized static boolean configureFactory(
InternalLogFactory factory) {
if (factory == null)
throw new IllegalArgumentException();
if (factoryConfigured)
return false;
InternalLogFactory.factory = factory;
factoryConfigured = true;
return true;
}
}