All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.star.log.LogFactory Maven / Gradle / Ivy

The newest version!
package com.star.log;

import com.star.io.resource.ResourceUtil;
import com.star.lang.Caller;
import com.star.log.dialect.commons.ApacheCommonsLogFactory;
import com.star.log.dialect.console.ConsoleLogFactory;
import com.star.log.dialect.jdk.JdkLogFactory;
import com.star.log.dialect.log4j.Log4jLogFactory;
import com.star.log.dialect.log4j2.Log4j2LogFactory;
import com.star.log.dialect.slf4j.Slf4jLogFactory;
import com.star.log.dialect.tinylog.TinyLogFactory;

import java.net.URL;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 日志工厂类
 *
 * @author Looly
 * @see Slf4jLogFactory
 * @see Log4j2LogFactory
 * @see Log4jLogFactory
 * @see ApacheCommonsLogFactory
 * @see TinyLogFactory
 * @see ConsoleLogFactory
 * @see JdkLogFactory
 */
public abstract class LogFactory {

    protected String logFramworkName;
    private Map logCache;

    public LogFactory(String logFramworkName) {
        this.logFramworkName = logFramworkName;
        logCache = new ConcurrentHashMap<>();
    }

    /**
     * @return 当前使用的日志工厂
     */
    public static LogFactory getCurrentLogFactory() {
        return GlobalLogFactory.get();
    }

    /**
     * 自定义日志实现
     *
     * @param logFactory 日志工厂类对象
     * @return 自定义的日志工厂类
     * @see Slf4jLogFactory
     * @see Log4jLogFactory
     * @see Log4j2LogFactory
     * @see ApacheCommonsLogFactory
     * @see JdkLogFactory
     * @see ConsoleLogFactory
     */
    public static LogFactory setCurrentLogFactory(LogFactory logFactory) {
        return GlobalLogFactory.set(logFactory);
    }

    /**
     * 自定义日志实现
     *
     * @param logFactoryClass 日志工厂类
     * @return 自定义的日志工厂类
     * @see Slf4jLogFactory
     * @see Log4jLogFactory
     * @see Log4j2LogFactory
     * @see ApacheCommonsLogFactory
     * @see JdkLogFactory
     * @see ConsoleLogFactory
     */
    public static LogFactory setCurrentLogFactory(Class logFactoryClass) {
        return GlobalLogFactory.set(logFactoryClass);
    }

    /**
     * 获得日志对象
     *
     * @param name 日志对象名
     * @return 日志对象
     */
    public static Log get(String name) {
        return getCurrentLogFactory().getLog(name);
    }

    /**
     * 获得日志对象
     *
     * @param clazz 日志对应类
     * @return 日志对象
     */
    public static Log get(Class clazz) {
        return getCurrentLogFactory().getLog(clazz);
    }

    // ------------------------------------------------------------------------- Static start

    /**
     * @return 获得调用者的日志
     */
    public static Log get() {
        return get(Caller.getCallerCaller());
    }

    /**
     * 决定日志实现
     *
     * @return 日志实现类
     * @see Slf4jLogFactory
     * @see Log4j2LogFactory
     * @see Log4jLogFactory
     * @see ApacheCommonsLogFactory
     * @see ConsoleLogFactory
     * @see JdkLogFactory
     */
    public static LogFactory create() {
        LogFactory logFactory;
        try {
            logFactory = new Slf4jLogFactory(true);
        } catch (NoClassDefFoundError e) {
            try {
                logFactory = new Log4j2LogFactory();
            } catch (NoClassDefFoundError e2) {
                try {
                    logFactory = new Log4jLogFactory();
                } catch (NoClassDefFoundError e3) {
                    try {
                        logFactory = new ApacheCommonsLogFactory();
                    } catch (NoClassDefFoundError e4) {
                        try {
                            logFactory = new TinyLogFactory();
                        } catch (NoClassDefFoundError e5) {
                            // 未找到任何可支持的日志库时判断依据:当JDK Logging的配置文件位于classpath中,使用JDK Logging,否则使用Console
                            final URL url = ResourceUtil.getResource("logging.properties");
                            logFactory = (null != url) ? new JdkLogFactory() : new ConsoleLogFactory();
                        }
                    }
                }
            }
        }

        return logFactory;
    }

    /**
     * 获得日志对象
     *
     * @param name 日志对象名
     * @return 日志对象
     */
    public Log getLog(String name) {
        Log log = logCache.get(name);
        if (null == log) {
            log = createLog(name);
            logCache.put(name, log);
        }
        return log;
    }

    /**
     * 获得日志对象
     *
     * @param clazz 日志对应类
     * @return 日志对象
     */
    public Log getLog(Class clazz) {
        Log log = logCache.get(clazz);
        if (null == log) {
            log = createLog(clazz);
            logCache.put(clazz, log);
        }
        return log;
    }

    /**
     * 创建日志对象
     *
     * @param name 日志对象名
     * @return 日志对象
     */
    public abstract Log createLog(String name);

    /**
     * 创建日志对象
     *
     * @param clazz 日志对应类
     * @return 日志对象
     */
    public abstract Log createLog(Class clazz);

    /**
     * 检查日志实现是否存在
* 此方法仅用于检查所提供的日志相关类是否存在,当传入的日志类类不存在时抛出ClassNotFoundException
* 此方法的作用是在detectLogFactory方法自动检测所用日志时,如果实现类不存在,调用此方法会自动抛出异常,从而切换到下一种日志的检测。 * * @param logClassName 日志实现相关类 */ protected void checkLogExist(Object logClassName) { // 不做任何操作 } // ------------------------------------------------------------------------- Static end }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy