具有多个文件的记录器 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 组合提供一个新的记录器
我想生成具有多个日志文件的记录器。
这是我的 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 组合提供一个新的记录器