创建一个
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");
}
class MyClass2 {
LogMe logMe2 = new LogMe();
Logger logger2 = logMe2.getLogger();
logger.info("X 02");
}
请注意,无论您在类中命名LogMe及其Logger,它都不会产生任何影响,因为它们引用了LogMe及其Logger的相同实例
日志文件中的示例输出如下所示:
Oct 1, 2015 10:43:47 AM
INFO: X 01
Oct 1, 2015 10:43:47 AM
INFO: X 02
请注意,这些日志行的顺序取决于类的执行顺序.您也不需要任何同步,引用Logger的JavaDoc:
All methods on Logger are multi-thread safe.