Java 从多个类登录到文件系统

Java 从多个类登录到文件系统,java,logging,io,java.util.logging,Java,Logging,Io,Java.util.logging,我正在使用内置的java.util.logging.Logger在运行时记录一些信息。另外,我希望日志被写在文件系统上。因此,基本上我认为我应该创建一个带有单例模式的记录器,在我的所有类中使用它,然后将文件保存到文件系统中。不幸的是,从来没有写过文件。我在控制台输出中看到了日志,来自所有多个类的所有日志都显示在那里。但我不确定为什么我的代码不会创建文件 以下是我尝试过的: package util; import gui.ExceptionDialog; import org.codehaus

我正在使用内置的
java.util.logging.Logger
在运行时记录一些信息。另外,我希望日志被写在文件系统上。因此,基本上我认为我应该创建一个带有
单例模式的记录器,在我的所有类中使用它,然后将文件保存到文件系统中。不幸的是,从来没有写过文件。我在控制台输出中看到了日志,来自所有多个类的所有日志都显示在那里。但我不确定为什么我的代码不会创建文件

以下是我尝试过的:

package util;

import gui.ExceptionDialog;
import org.codehaus.plexus.util.FileUtils;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;


    public class LoggerWrapper {

    public static final Logger myLogger = Logger.getLogger("Stockparty Log");

    private static LoggerWrapper instance = null;
    private static Date date = new Date();
    private static SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyy");
    private static String fileName = "spLog-"+formatter.format(date)+".log";

    public static LoggerWrapper getInstance() {
        if(instance == null) {
            prepareLogger(Level.INFO);
            instance = new LoggerWrapper ();
        }
        return instance;
    }


    private static void prepareLogger(Level level) {

        File file = null;
        if (OSValidator.isWindows()) {
            System.out.println("This is Windows");
            file = new File(System.getenv("APPDATA") + File.separator + "StockParty" + File.separator + fileName);

            if (!file.exists()) {
                try {
                    FileUtils.forceMkdir(file.getParentFile());
                } catch (IOException ex) {
                    ExceptionDialog exceptionDialog = new ExceptionDialog("Schreibfehler", "Ordnder, um Statistik abzulegen konnte nicht erzeugt werden", ex);
                    exceptionDialog.show();
                }
            }

        } else if (OSValidator.isMac()) {
            System.out.println("This is Mac");

            file = new File(System.getProperty("user.home") + File.separator + "Library" + File.separator + "Application Support"
                    + File.separator + "StockParty" + File.separator + fileName);
            if (!file.exists()) {
                try {
                    FileUtils.forceMkdir(file.getParentFile());
                } catch (IOException ex) {
                    ExceptionDialog exceptionDialog = new ExceptionDialog("Schreibfehler", "Ordnder, um Statistik abzulegen konnte nicht erzeugt werden", ex);
                    exceptionDialog.show();
                }
            }

            FileHandler myFileHandler = null;
            try {
                myFileHandler = new FileHandler(file.getAbsolutePath());
            } catch (IOException e) {
                e.printStackTrace();
            }
            myFileHandler.setFormatter(new SimpleFormatter());
            myLogger.addHandler(myFileHandler);
            myLogger.setUseParentHandlers(false);
            myLogger.setLevel(level);
        }
    }

}

噢,顺便说一句,
APPDATA
中的目录是创建的,但缺少文件。

您有权在特定位置创建文件吗?请检查您从System.getProperty(“user.home”)+file.separator+“Library”+file.separator+“Application Support”获取的路径是否正确存在?我在windows上,因此mac的路径不存在,但也从未使用过。路径对于windows是正确的,我检查了它。看来你的第一个假设是对的。我在AppData中创建的目录“StockParty”受写保护。我将验证这是我正在搜索的bug,并在这里报告我的结果。感谢这个想法如果这真的是我正在搜索的bug,为什么创建的是目录而不是文件,在这种情况下我不应该捕获IOException吗?检查Parehentes嵌套。在第一次阅读之后,恐怕只有当OSValidator.isMac()==true时才会调用addHandler方法。