log4j不会在Windows

时间:2016-04-02 09:31:01

标签: java javafx log4j

我的Windows程序出现问题,我包含了日志记录,因此我可以找到问题的具体原因。我的程序的JavaFX并在Windows上启动它我将它构建为.jar文件。

我通过程序代码设置log4j FileAppender,在config-file(... / MyProject / data / configuration.txt)中是获取日志文件夹的路径。在Mac OS X上(使用Eclipse调试)一切正常。

如果我在Windows上启动jar(... / MyProject / build / dist / MyProgram.jar)并查看配置的日志文件夹,我将看不到创建的任何日志文件。 (我发现配置文件不得不在... / MyProject / build / dist / data / configuration.txt下)如果我将新的子文件夹写入日志目录的路径,程序会创建它们,但是那里没有档案!

我的代码:

String computername = "";
        try {
            computername = InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        int tid = (int)Thread.currentThread().getId();
        PatternLayout playout = new PatternLayout("%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}; %p; %F:%L; " + computername + "; " + tid + "; [%t]; %m;%n");

        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        Date datenow = new Date();
        datenow.setTime(datenow.getTime());
        FcManagerMain.formatteddate = dt.format(datenow);

        try
        {
            File config  = new File ("data/configuration.txt");
            BufferedReader bufferedReader = new BufferedReader(new FileReader("data/configuration.txt"));   
            int count = 1;
            String line = null;
            while((line = bufferedReader.readLine()) != null)
            {
                if(count == 3)
                {
                    FcManagerMain.logfolder = line;
                }
                count++;
            }

            if(isWindows())
            {
                File p = new File(FcManagerMain.logfolder + FcManagerMain.version);
                p.mkdirs();
                File pp = new File(FcManagerMain.logfolder + FcManagerMain.version + "\\" + FcManagerMain.formatteddate + ".log");
                pp.createNewFile();
                FileAppender fileAppender = new FileAppender(playout, pp.getAbsolutePath(), false);
                loggerstatic.addAppender(fileAppender);
                loggerstatic.setLevel(Level.ALL);
            }
            else
            {
                File p = new File(FcManagerMain.logfolder + FcManagerMain.version);
                p.mkdirs();
                File pp = new File(FcManagerMain.logfolder + FcManagerMain.version + "/" + FcManagerMain.formatteddate + ".log");
                pp.createNewFile();
                FileAppender fileAppender = new FileAppender(playout, pp.getAbsolutePath(), false);
                loggerstatic.addAppender(fileAppender);
                loggerstatic.setLevel(Level.ALL);
            }
        }
        catch(Exception ee)
        {
            System.out.println(getStackTrace(ee));
        }

loggerstatic是一个静态Logger实例(FcManagerController.loggerstatic),每个其他类都从loggerstatic获取其记录器。我猜那不对,请告诉我该怎么做!

编辑:我已经尝试了不同的日志位置,看看我是否有权写入该特定文件夹。

谢谢, rapgru

1 个答案:

答案 0 :(得分:0)

我宁愿建议您使用内置配置,i。即适应log4j.properties。

在此处阅读documentation,尤其是${log}的用法:

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

您默认声明自己的系统变量,并在启动应用时通过jvm参数更改它:

# log directory (default, 'log' directory relative to the execution path)
# you can override the default directory by setting the variable as VM option when you start the application
# example: -DMYAPP_LOG_DIR=/tmp/logs
MYAPP_LOG_DIR=./log

...
log4j.appender.debugfile.file=${MYAPP_LOG_DIR}/application.log

然后,当您启动应用程序并且不希望日志文件位于执行文件夹中时,只需通过-D选项指定其他路径。