使用java.util.Logging

时间:2017-04-24 14:41:35

标签: java logging

(我希望将某些类记录到单个文件中,并将某些类记录到各自的日志文件中。)

(我不想使用像log4j或slf4j这样的库,请不要推荐这些。)

我遇到的问题是

到目前为止每个类都有自己的日志文件,我已经使用Java.util.logging实现了。 但是现在要求某些类应该记录到一个文件。

我知道如何记录到一个文件,但主要的是我为所有类编写的功能,以写入它的相应日志文件。我不想复制该代码,因为将日志写入单个文件的类将使用相同的方法。

对于登录到同一个文件,我需要一个logger对象,我可以通过static keyword来实现。

这是已经写完的全班

 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;
}

现在我可以在所有将它们的日志写入一个文件的类中使用它。

1 个答案:

答案 0 :(得分:1)

记录器(java.util.logging.Logger类的实例)位于命名空间层次结构中,由您提供Logger.getLogger(String name)的名称定义。

因此,您可以将一个记录器附加到com.,另一个附加到com.consolelogging.,另一个附加到com.filelogging.名称。

我认为在您的情况下,您可以根据类的完全限定名称创建每个记录器,从而确保每个类都有自己的记录器。

您可以通过命名空间创建一些没有任何子项连接的根级别记录器,并将每个记录器的输出泵送到单独的文件中。

换句话说,您调用Logger.gerLogger("file_one")的每个类都将记录到为此记录器定义的appender定义的同一文件。

将每个类记录到一个单独的文件中也是非常低效(并阻碍分析),但如果这些是您的要求,那么就这样吧。

希望这有帮助。