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

io.github.wycst.wast.log.LoggerManagerHandler Maven / Gradle / Ivy

package io.github.wycst.wast.log;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;

/**
 * @Author: wangy
 * @Date: 2021/8/22 18:32
 * @Description:
 */
public class LoggerManagerHandler {

    private static final Map LOGGER_PROPERTIES = new HashMap();
    private static final String LEVEL_KEY = "logger.level";
    private static Level level;

    private static Map fileHandlerHolders = new ConcurrentHashMap();
    private static Map levelMap = new HashMap();
    private static ConsoleHandler consoleHandler;
    private static String consolePackages;

    static void init() {
//        // 设置自定义的LogManager
//        System.setProperty("java.util.logging.manager", LoggerManager.class.getName());
//        InputStream is = LogFactory.class.getResourceAsStream("/logging.properties");
//        if (is != null) {
//            try {
//                LogManager.getLogManager().reset();
//                LogManager.getLogManager().readConfiguration(is);
//            } catch (IOException e) {
//            }
//        }
        InputStream is = LogFactory.class.getResourceAsStream("/logging.properties");
        if (is != null) {
            Properties properties = new Properties();
            try {
                properties.load(is);
                LOGGER_PROPERTIES.putAll((Map) properties);
                parseLoggerHandlers();
            } catch (IOException e) {
            }
        } else {
            // default
            parseLoggerHandlers();
        }
    }

    static void setConsoleLevel(Level level) {
        consoleHandler.setLevel(level);
    }

    private static void parseLoggerHandlers() {
        setConsoleHandler();
        setFileHandlers();
        initLevelMap();
    }

    private synchronized static void setConsoleHandler() {
        if (consoleHandler == null) {
            consoleHandler = new ConsoleHandler();
            consoleHandler.setFormatter(new ConsoleFormatter());
        }
        consolePackages = LOGGER_PROPERTIES.get("logger.console.packages");
        Level consoleLevel = getLevel(LOGGER_PROPERTIES.get("logger.console.level"), null);
        if (consoleLevel != null) {
            consoleHandler.setLevel(consoleLevel);
        }
    }

    private static void setFileHandlers() {
        fileHandlerHolders.clear();
        String loggerFileHandlers = LOGGER_PROPERTIES.get("logger.file.handlers");
        if (loggerFileHandlers != null) {
            String[] fileHandleNames = loggerFileHandlers.split(",");
            for (String fileHandleName : new HashSet(Arrays.asList(fileHandleNames))) {
                String handlerPackages = LOGGER_PROPERTIES.get("logger.handler." + fileHandleName + ".packages");
                String handlerPattern = LOGGER_PROPERTIES.get("logger.handler." + fileHandleName + ".pattern");
                int limit = getInt(LOGGER_PROPERTIES.get("logger.handler." + fileHandleName + ".limit"), Integer.MAX_VALUE);
                int count = getInt(LOGGER_PROPERTIES.get("logger.handler." + fileHandleName + ".count"), 1);
                Level level = getLevel(LOGGER_PROPERTIES.get("logger.handler." + fileHandleName + ".level"), null);
                if (handlerPattern != null) {
                    try {
                        FileHandlerHolder fileHandlerHolder = new FileHandlerHolder(fileHandleName, handlerPattern, limit, count);
                        if (level != null) {
                            fileHandlerHolder.setLevel(level);
                        }
                        fileHandlerHolder.setPackages(handlerPackages);
                        fileHandlerHolders.put(fileHandleName, fileHandlerHolder);
                    } catch (IOException e) {
                    }
                }
            }
        }
    }

    private synchronized static void initLevelMap() {
        levelMap.clear();
        for (Map.Entry entry : LOGGER_PROPERTIES.entrySet()) {
            String key = entry.getKey();
            if (key.endsWith(".level")) {
                String customPackageLevel = key.substring(0, key.length() - 6);
                Level level = getLevel(entry.getValue(), null);
                if (level != null) {
                    levelMap.put(customPackageLevel, level);
                }
            }
        }
    }

    static List matchHandlers(Class logCls) {
        List fileHandlers = new ArrayList();
        // 通过class匹配文件handler
        String logClassName = logCls.getName();
        if (matchPackages(logClassName, consolePackages)) {
            if(consoleHandler != null) {
                fileHandlers.add(consoleHandler);
            }
        }
        for (FileHandlerHolder fileHandlerHolder : fileHandlerHolders.values()) {
            FileHandler fileHandler = fileHandlerHolder.getFileHandler();
            String packages = fileHandlerHolder.getPackages();
            if (matchPackages(logClassName, packages)) {
                fileHandlers.add(fileHandler);
            }
        }
        return fileHandlers;
    }

    static Level matchLevel(Class logCls) {
        String logClassName = logCls.getName();
        for (Map.Entry entry : levelMap.entrySet()) {
            String pk = entry.getKey();
            if (logClassName.startsWith(pk) || logClassName.matches(pk)) {
                return entry.getValue();
            }
        }
        return null;
    }

    private static boolean matchPackages(String logClassName, String packages) {
        if (packages == null || packages.length() == 0) {
            return true;
        }
        String[] pcks = packages.split(",");
        for (String pck : pcks) {
            if (logClassName.startsWith(pck)) {
                return true;
            }
        }
        return false;
    }

//    private static Level getLevelProperty(Properties properties, String levelKey, Level level) {
//        String levelName = properties.getProperty(levelKey);
//        if (levelName == null || levelName.length() == 0) {
//            return level;
//        }
//        return Level.parse(levelName);
//    }

    private static Level getLevel(String levelName, Level level) {
        if (levelName == null || levelName.length() == 0) {
            return level;
        }
        return Level.parse(levelName);
    }


    private static int getInt(String value, int i) {
        try {
            return Integer.parseInt(value);
        } catch (Throwable throwable) {
        }
        return i;
    }

//    private static int getIntProperty(Properties properties, String key, int i) {
//        try {
//            return Integer.parseInt(properties.getProperty(key));
//        } catch (Throwable throwable) {
//        }
//        return i;
//    }

    public static void putAll(Map logProps) {
        if (logProps != null) {
            LOGGER_PROPERTIES.putAll(logProps);
            parseLoggerHandlers();
        }
    }

    static Set logKeySet() {
        return LOGGER_PROPERTIES.keySet();
    }

    static void putLogProperty(String key, String value) {
        LOGGER_PROPERTIES.put(key, value);
    }

    static String getLogProperty(String key) {
        return LOGGER_PROPERTIES.get(key);
    }

    public static void clear() {
        LOGGER_PROPERTIES.clear();
        levelMap.clear();
        for (FileHandlerHolder handlerHolder : fileHandlerHolders.values()) {
            handlerHolder.clear();
        }
        fileHandlerHolders.clear();
    }

    public static Level getLogLevel() {
        String levelName = LOGGER_PROPERTIES.get(LEVEL_KEY);
        if (levelName == null) {
            return null;
        }
        if (level != null && levelName.equals(level.getName())) {
            return level;
        }
        try {
            level = Level.parse(levelName);
            return level;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy