具有多个文件的记录器 cdi

Logger cdi with multiple file

我想生成具有多个日志文件的记录器。
这是我的 cdi 产品 class:

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import java.io.IOException;
import java.util.logging.*;

@ApplicationScoped
public class LoggerProducer {

    @Produces
    private Logger logger(InjectionPoint ip) throws IOException {
        return generalLogger(ip);
    }

    @Produces
    @Log(Log.LogType.GENERAL)
    private Logger generalLogger(InjectionPoint ip) throws IOException {
        LogManager.getLogManager().reset();

        Handler handler = new FileHandler(Log.LogType.GENERAL.getValue(), 200000, 5, true);
        handler.setLevel(Level.ALL);
        handler.setFormatter(new LogFormat());

        Logger logger = Logger.getGlobal();
        logger.setLevel(Level.ALL);
        logger.addHandler(handler);
        return logger;
    }

    @Produces
    @Log(Log.LogType.SIGNAL)
    private Logger signalLogger(InjectionPoint ip) throws IOException {
        LogManager.getLogManager().reset();

        Handler handler = new FileHandler(Log.LogType.SIGNAL.getValue(), 200000, 5, true);
        handler.setLevel(Level.ALL);
        handler.setFormatter(new LogFormat());

        Logger logger = Logger.getGlobal();
        logger.setLevel(Level.ALL);
        logger.addHandler(handler);
        return logger;
    }

    @Produces
    @Log(Log.LogType.ACTIVATION_KEY)
    private Logger activationKeyLogger(InjectionPoint ip) throws IOException {
        LogManager.getLogManager().reset();

        Handler handler = new FileHandler(Log.LogType.ACTIVATION_KEY.getValue(), 200000, 5, true);
        handler.setLevel(Level.ALL);
        handler.setFormatter(new LogFormat());

        Logger logger = Logger.getGlobal();
        logger.setLevel(Level.ALL);
        logger.addHandler(handler);
        return logger;
    }
}

这是我的注释:

@Retention(RUNTIME)
@Target({FIELD, METHOD})
@Qualifier
public @interface Log {

    LogType value() default LogType.GENERAL;

    public enum LogType {
        GENERAL("logs/general.log"),
        SIGNAL("logs/signal.log"),
        ACTIVATION_KEY("logs/activation_key.log");

        private String value;

        LogType(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
}

我的问题是日志总是写在最后一个被注释的文件中。
例如:
第一个记录器写在带有注释的文件上:@Log(Log.LogType.GENERAL)
当记录器将日志写入带有注释的文件时:@Log(Log.LogType.SIGNAL)
现在 GENERAL 日志也写入 SIGNAL 文件。
有解决此问题的解决方案吗?

注意: 日志引擎是 java.util.logging.Logger
注意:带有 OpenLiberty 应用程序服务器的 JavaEE 8

我认为问题在于您一直在使用全局记录器。
某个名称只有一个记录器。
当您更改此 Logger 的 Filehandler 时,每个已存在的 Instance of is Logger 将使用新的 Filehandler。

您必须为不同的记录器使用不同的名称。

@ApplicationScoped
public class LoggerProducer {

    @Produces
    private Logger logger(InjectionPoint ip) throws IOException {
        return generalLogger(ip);
    }

    @Produces
    @Log(Log.LogType.GENERAL)
    private Logger generalLogger(InjectionPoint ip) throws IOException {
        return getLogger(ip, Log.LogType.GENERAL);
    }

    @Produces
    @Log(Log.LogType.SIGNAL)
    private Logger signalLogger(InjectionPoint ip) throws IOException {
        return getLogger(ip, Log.LogType.SIGNAL);
    }

    @Produces
    @Log(Log.LogType.ACTIVATION_KEY)
    private Logger activationKeyLogger(InjectionPoint ip) throws IOException {
        return getLogger(ip, Log.LogType.ACTIVATION_KEY);
    }
    
    private Logger getLogger(InjectionPoint ip, Log.LogType type){
        LogManager.getLogManager().reset();

        Handler handler = new FileHandler(type.getValue(), 200000, 5, true);
        handler.setLevel(Level.ALL);
        handler.setFormatter(new LogFormat());

        Logger logger = Logger.getLogger(ip.getMember().getDeclaringClass().getName() + "-" + type.name())
        logger.setLevel(Level.ALL);
        logger.addHandler(handler);
        return logger;
    }
}

这应该为每个 InjectionPoint/Logtype 组合提供一个新的记录器