mouzt / mzt-biz-log

支持Springboot,基于注解的可使用变量、可以自定义函数的通用操作日志组件
Apache License 2.0
2.06k stars 483 forks source link

LogRecordContext感觉可以修改一下 #64

Closed Gloduck closed 2 years ago

Gloduck commented 2 years ago

每次进入一个方法创建一个新的map入栈,可以用修饰符来保证,而不是通过注释来保证。 如下:

public class LogRecordHolder {
    private static final InheritableThreadLocal<Stack<Map<String, Object>>> variableMapStack = new InheritableThreadLocal<>();

    /**
     * 放入方法变量
     *
     * @param key  键
     * @param value 值
     */
    public static void putVariable(String key, Object value) {
        getVariableMap(false).put(key, value);
    }

    /**
     * 获取方法变量
     *
     * @param key 键
     * @return {@link Object}
     */
    public static Object getVariable(String key) {
        return getVariableMap(false).get(key);
    }

    /**
     * 获取方法变量Map
     *
     * @return {@link Map}<{@link String}, {@link Object}>
     */
    public static Map<String, Object> getVariableMap() {
        return getVariableMap(false);
    }

    /**
     * 清理Log变量Map
     */
    public static void clear() {
        Stack<Map<String, Object>> mapStack = variableMapStack.get();
        if(mapStack == null || mapStack.size() == 0){
            variableMapStack.remove();
        } else {
            mapStack.pop();
        }
    }

    /**
     * 获取变量map
     *
     * @param createNew 是否创建一个新的map
     * @return {@link Map}<{@link String}, {@link Object}>
     */
    static Map<String, Object> getVariableMap(boolean createNew){
        Stack<Map<String, Object>> mapStack = variableMapStack.get();
        if (mapStack == null) {
            mapStack = new Stack<>();
            variableMapStack.set(mapStack);
        }
        Map<String, Object> variableMap;
        if(createNew || mapStack.size() == 0){
            variableMap = new HashMap<>(4);
            mapStack.push(variableMap);
        } else {
            variableMap = mapStack.peek();
        }
        return variableMap;
    }
}
mouzt commented 2 years ago

可以可以的👍🏻

mouzt commented 2 years ago

下个版本修复的