2

はい、この質問は以前に尋ねられましたが、問題はもう少し複雑です。これに関連する以前の質問のすべての解決策を使用しました。

関連: Java ファイル ハンドルの解放Java は何があってもファイル ロックを保持します。

package me.test;

import java.io.File;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class Test {
    Logger log = Logger.getAnonymousLogger();
    FileHandler handle;

    final static String newline = System.lineSeparator();
    /**
     * @param args
     */
    public static void main(String[] args) {
        Test t = new Test();
        t.run();
    }
    public void run()
    {
        for (int i = 0; i < 6; i++) {
            testLogs();
            change();
        }
        testLogs();
        if (handle != null)
        {
            handle.close();
            log.removeHandler(handle);
        }
    }
    public static FileHandler craftFileHandler(File file, boolean append)
    {
        if (file == null)
            return null;
        FileHandler fh = null;
        try {
            fh = new FileHandler(file.getPath(), append);
            fh.setFormatter(new Formatter() {

                @Override
                public String format(LogRecord record) {
                    return "[test] " + "[" + record.getLevel().toString() + "]" + String.format(record.getMessage(), record.getParameters()) + newline;
                }
            });
            return new FileHandler(file.getPath(), append);
        } catch (Exception e) {
            if (fh != null)
                fh.close();
            return null;
        } 
    }

    public void change()
    {
        if (handle != null)
        {
            handle.flush();
            handle.close();
            log.removeHandler(handle);
        }
        handle = null;
        File f = new File("log.log");
        handle = craftFileHandler(f, true);
        System.out.println(f.getAbsolutePath());
        if (handle != null)
            log.addHandler(handle);
    }
    public void testLogs()
    {
        if (log == null)
        {
            log = Logger.getLogger("test");
            log.setLevel(Level.ALL);
        }
        log.info("This is info #1");
        log.warning("Warning 1");
        log.info("meh info again.");
        log.severe("SEVERE HELL YA NICE TEST");
        log.info("You sure its good here?");
        log.info("Handler count " + log.getHandlers().length);
    }
}

このコードは、テスト コードを意図しています。私が持っているプロジェクトでこの問題を修正する方法を理解できるように、このテスト ファイルを作成しました。

このループがあるのは、問題が発生するのが速すぎて説明できないためです。したがって、ループはそれをシミュレートする最良の方法でした。私のプロジェクトには、ログ ファイルを配置する場所を選択するための構成があります。ただし、リロード時にファイルが構成で変更されていない場合。ファイルをロックしたままにして、リロードするたびに余分なファイルを作成する傾向があります

これを機能させたいと思います。これが正常に機能し始めたら。その後、プロジェクトに適切に実装できます。

4

4 に答える 4

2

FileHandler を作成し、決して閉じないため、複数のファイルが作成されています。

fh = new FileHandler(file.getPath(), append);
...
return new FileHandler(file.getPath(), append);

修正?

return fh;

最終的にかどうかはまったく違いはありません。この場合、実際には catch ブロックで閉じたいと思っています。そうしないと何も閉じることができないからです。

于 2013-08-23T02:48:05.257 に答える
1

log メソッドを使用した後、すべてのハンドラを閉じます。

    this.logger.log(Level.SEVERE, (exception.getClass().getName() + ": " + exception.getMessage()) + "\r\n" + exception.getCause() + "\r\n" + "\r\n");

    for (Handler handler : this.logger.getHandlers())
    {
        handler.close();
    }
于 2014-01-09T11:16:32.107 に答える
0

さて、ここに 1 つの問題があります。

 try {
            fh = new FileHandler(file.getPath(), append);
            fh.setFormatter(new Formatter() {

                @Override
                public String format(LogRecord record) {
                    return "[test] " + "[" + record.getLevel().toString() + "]" + String.format(record.getMessage(), record.getParameters()) + newline;
                }
            });
            return new FileHandler(file.getPath(), append);
        } catch (Exception e) {
            if (fh != null)
                fh.close();
            return null;

try ステートメントでファイルを閉じることはなく、エラーが発生した場合にのみ閉じます。作業が完了したらすぐにファイルを閉じる必要があります。

 try {
            fh = new FileHandler(file.getPath(), append);
            fh.setFormatter(new Formatter() {

                @Override
                public String format(LogRecord record) {
                    return "[test] " + "[" + record.getLevel().toString() + "]" + String.format(record.getMessage(), record.getParameters()) + newline;
                }
            });
            //close fh
            fh.close();
            return new FileHandler(file.getPath(), append);
        } catch (Exception e) {
            if (fh != null)
                fh.close();
            return null;
于 2013-08-22T23:31:48.640 に答える