【发布时间】:2017-04-24 14:41:35
【问题描述】:
(我想将某些类记录到单个文件中,并将某些类记录到它们各自的日志文件中。)
(我不想使用 log4j 或 slf4j 之类的任何库,请不要推荐这些。)
我的问题是
到目前为止,每个类都有自己的日志文件,我已经使用 Java.util.logging 实现了。 但是现在有些类需要记录到一个文件中。
我知道如何记录到一个文件,但主要是我为所有类编写的功能可以写入其各自的日志文件。我不想复制该代码,因为将日志写入单个文件的类将使用相同的方法。
至于登录到同一个文件,我需要一个记录器对象,我可以通过静态关键字来实现。
这是写完的整个类
public class LogHelper {
private static String logPath = "/Users/Desktop/checklog";
private static Logger logger;
private String callingMethodName;
private static FileHandler fileHandler;
public LogHelper() {
super();
}
public LogHelper(String loggerName, String callingMethodName) {
logger = Logger.getLogger(loggerName);
this.callingMethodName = callingMethodName;
}
public String getPrefix(String method) {
String prefix = new StrBuilder(callingMethodName).append(".").append(method).append(": ").toString();
return prefix;
}
public void logDebug(String message) {
logger.logp(Level.ALL, "", "", message);
}
public void logError(String message) {
logger.logp(Level.SEVERE, "", "", message);
}
public void logWarn(String message) {
logger.logp(Level.WARNING, "", "", message);
}
public void logInfo(String message) {
logger.info(message);
}
public void logTrace(String message) {
logger.trace(message);
}
public static void setFileHandler(String fileName) throws IOException {
try {
String filePath = new StringBuffer().append(System.getProperty("user.dir")).append(File.separator).append("logs").append(File.separator).toString();
FileUtils.forceMkdir(new File(filePath));
FileHandler fileHandler = new FileHandler(new StringBuffer(filePath).append(fileName).append(".log").toString(), true);
System.out.println("setFileHandler() File Path :" + filePath);
logger.addHandler(fileHandler);
SimpleFormatter formatter = new SimpleFormatter();
fileHandler.setFormatter(formatter);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void closeFileHander() {
try {
if (fileHandler != null) {
logger.removeHandler(fileHandler);
fileHandler.flush();
fileHandler.close();
}
} catch (Exception ex) {
}
}
}
我想利用这个类,以便一些类能够写入单个文件,而另一些能够写入它们各自的文件。
好的,暂时我已经这样解决了。
我已经创建了这个类的静态对象,然后添加了一个新的静态方法,它将返回这个对象,但在返回之前会为它设置记录器。
所以我在上面写的类中添加了这些行。
private static LogHelper logHelper;
public static LogHelper getHelper(String loggerName,String fileName){
if(logHelper == null){
logHelper = new LogHelper();
}
logHelper.logger = Logger.getLogger(loggerName);
logHelper.setFileHandler(fileName);
return logHelper;
}
现在我可以在将日志写入一个文件的所有类中使用它。
【问题讨论】:
-
String filePath = new StringBuffer().append(System.getProperty("user.dir")).append(File.separator).append... 这就是 1996 年构建字符串的方式。使用+运算符,或 Paths.get,或 String.format — 它们都比使用字符串缓冲区。 -
使用StringBuffer是因为多线程可以访问该方法。
-
这不是多线程的工作方式。本地创建的对象本质上是线程安全的。每个方法调用都会创建自己的实例,这些实例永远不会与任何其他线程共享。 StringBuffer 在您的情况下没有任何好处。
-
好的谢谢VGR让我和写它的div讨论一下。