在多个记录器中使用相同的文件处理程序是个好主意吗?我使用Java日志框架,我希望不同的记录器写入同一个日志文件,但我不知道下面这个代码示例是否是一个很好的编程风格。
import java.io.*;
import java.util.logging.*;
public class Alpha {
private static final Logger LOGGER = Logger.getLogger(Alpha.class.getName());
private static FileHandler loggingHandler;
static {
try {
loggingHandler = new FileHandler("logfile.log", true);
LOGGER.addHandler(loggingHandler);
} catch (IOException e) {
e.printStackTrace();
}
}
public static FileHandler getLoggingHandler() {
return loggingHandler;
}
}
class Beta {
private static final Logger LOGGER = Logger.getLogger(Beta.class.getName());
static {
LOGGER.addHandler(Alpha.getLoggingHandler());
}
}
答案 0 :(得分:1)
我没有看到为多个记录器使用一个文件处理程序的任何问题。但是,将文件处理程序配置放入单独的属性文件或某个配置数据库
总是更好的做法答案 1 :(得分:0)
答案是肯定的。您可以通过创建singleton日志类来实现此目的(例如),以便任何其他类或线程尝试创建它的副本,实际上将使用相同的实例。
使用java.util.logging
的示例实现:
public class LogMe {
private static LogMe logMe;
private static Logger logger;
private static FileHandler fh;
private static Formatter sf;
public LogMe() {
//Make this class a singleton
if (logMe != null) {
return;
}
//Create the log file
try {
fh = new FileHandler("../xyz/LogFile.log");
} catch (Exception e) {
e.printStackTrace();
}
sf = new SimpleFormatter();
fh.setFormatter(sf);
logger.addHandler(fh);
//Part of making this class a singleton
logger = Logger.getLogger("LogMe");
logMe = this;
}
public Logger getLogger() {
return LogMe.logger;
}
}
然后在课程中,您将像这样使用:
class MyClass1 {
LogMe logMe1 = new LogMe();
Logger logger2 = logMe1.getLogger();
logger.info("X 01");
}
答案 2 :(得分:0)
通常,您只需在根记录器Logger.getLogger("")
上安装一个处理程序,因为它是Alpha
和Beta
的父记录程序。
但是,如果要在兄弟姐妹上安装处理程序,则应使用LogManager config
option or the java.util.logging.config.class
system property创建日志配置。
package app.configs;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
public final class SharedHandlerConfig {
private static final Logger[] LOGGERS
= new Logger[]{Logger.getLogger(Alpha.class.getName()),
Logger.getLogger(Beta.class.getName())};
private static final FileHandler FILE;
static {
try {
FileHandler f = new FileHandler("../xyz/logfile.log", true);
try {
for (Logger l : LOGGERS) {
l.addHandler(f);
}
FILE = f;
f = null;
} finally {
if (f != null) {
f.close();
for (Logger l : LOGGERS) {
l.removeHandler(f);
}
}
}
} catch (IOException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* From startup system property:
* -Djava.util.logging.config.class=app.configs.SharedHandlerConfig
*
* From logging.properties:
* config=app.configs.SharedHandlerConfig
*/
public SharedHandlerConfig() {
}
}