blob: c1ad6992efd3e493a953c7b23f74cd2fbc00d763 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab
package org.mariadb.jdbc.util.log;
import java.util.HashMap;
/** Loggers factory */
public final class Loggers {
/** defined if using JDK if sfl4j is not present. possible values: JDK/CONSOLE */
public static final String FALLBACK_PROPERTY = "mariadb.logging.fallback";
/** set if console must log debug level */
public static final String CONSOLE_DEBUG_PROPERTY = "mariadb.logging.fallback.console.debug";
/** !! testing only !! permit to disable SLF4J implementation even if SLF4j is present */
public static final String TEST_ENABLE_SLF4J = "mariadb.logging.slf4j.enable";
/** disable logging */
public static final String NO_LOGGER_PROPERTY = "mariadb.logging.disable";
/** factory */
private static LoggerFactory LOGGER_FACTORY;
static {
init();
}
/**
* Return default logger implementation
*
* @param name logger name
* @return logger implementation
*/
public static Logger getLogger(String name) {
return LOGGER_FACTORY.getLogger(name);
}
/**
* Return default logger implementation
*
* @param cls class
* @return logger implementation
*/
public static Logger getLogger(Class<?> cls) {
return LOGGER_FACTORY.getLogger(cls.getName());
}
private interface LoggerFactory {
Logger getLogger(String name);
}
private static class NoLoggerFactory implements LoggerFactory {
@Override
public Logger getLogger(String name) {
return new NoLogger();
}
}
private static class Slf4JLoggerFactory implements LoggerFactory {
@Override
public Logger getLogger(String name) {
return new Slf4JLogger(org.slf4j.LoggerFactory.getLogger(name));
}
}
/** JDK wrapper */
private static class JdkLoggerFactory implements LoggerFactory {
@Override
public Logger getLogger(String name) {
return new JdkLogger(java.util.logging.Logger.getLogger(name));
}
}
private static final class ConsoleLoggerFactory implements LoggerFactory {
private static final HashMap<String, Logger> consoleLoggers = new HashMap<>();
@Override
public Logger getLogger(String name) {
return consoleLoggers.computeIfAbsent(
name, n -> new ConsoleLogger(n, System.getProperty(CONSOLE_DEBUG_PROPERTY) != null));
}
}
/** Initialize factory */
public static void init() {
String name = LoggerFactory.class.getName();
LoggerFactory loggerFactory = null;
if (Boolean.parseBoolean(System.getProperty(NO_LOGGER_PROPERTY, "false"))) {
loggerFactory = new NoLoggerFactory();
} else {
try {
if (Boolean.parseBoolean(System.getProperty(TEST_ENABLE_SLF4J, "true"))) {
Class.forName("org.slf4j.LoggerFactory");
loggerFactory = new Slf4JLoggerFactory();
}
} catch (ClassNotFoundException cle) {
// slf4j not in the classpath
}
if (loggerFactory == null) {
// default to console or use JDK logger if explicitly set by System property
if ("JDK".equalsIgnoreCase(System.getProperty(FALLBACK_PROPERTY))) {
loggerFactory = new JdkLoggerFactory();
} else {
loggerFactory = new ConsoleLoggerFactory();
}
}
try {
loggerFactory.getLogger(name);
} catch (Throwable e) {
// eat
}
}
LOGGER_FACTORY = loggerFactory;
}
}