【问题标题】:Logger cdi with multiple file具有多个文件的记录器 cdi
【发布时间】:2023-03-10 11:50:01
【问题描述】:

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

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

【问题讨论】:

    标签: java logging cdi


    【解决方案1】:

    我认为问题在于您一直在使用全局 Logger。
    只有一个特定名称的记录器。
    当您更改此 Logger 的 Filehandler 时,每个已存在的 is Logger Instance 都将使用新的 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 组合提供一个新的 Logger

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多