1

これが私のコードです。なぜ何もログに記録されないのか疑問に思っています。コンソールに入力すると、次のように表示されます。

こんにちは

2013 年 4 月 8 日 10:13:47 PM java.util.logging.LogManager$RootLogger ログ

情報: こんにちは

ただし、どのファイルにも何も記録されていません。

import java.io.IOException;
import java.util.Scanner;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class main {
    public static void main(String[] args) throws IOException{

        while (1 == 1) {
            String text;
            Scanner in = new Scanner(System.in);
            text = in.nextLine();
            FileHandler fileTxt;
            SimpleFormatter formatterTxt;
            Logger logger = Logger.getLogger("");
            logger.setLevel(Level.INFO);
            fileTxt = new FileHandler("../loggedText.txt");
            formatterTxt = new SimpleFormatter();
            fileTxt.setFormatter(formatterTxt);
            logger.addHandler(fileTxt);
            logger.info(text);
        }
    }
}
4

1 に答える 1

0

ループは決して終了しません。つまり、JVM は適切なシャットダウンを実行しません。FileHandler は、すべてのロギング シャットダウン フックが正常に実行された場合にのみ閉じられ、同期されます。データが書き込まれたものの、ファイルシステムと同期されていない可能性があります。

正常に終了できる修正済みの例を作成しましょう。

public class main {

    private static final Logger logger = Logger.getLogger(""); //Prevent G.C.

    public static void main(String[] args) throws IOException {
        logger.setLevel(Level.INFO);
        FileHandler fileTxt = new FileHandler("../loggedText.txt");
        fileTxt.setFormatter(new SimpleFormatter());
        logger.addHandler(fileTxt);

        System.out.println("root.level " + logger.getLevel());
        System.out.println("FileHandler.level " + fileTxt.getLevel());
        Scanner in = new Scanner(System.in);
        String text;
        while (true) {
            System.out.print("Enter text: ");
            text = in.nextLine();
            if (text != null && !text.isEmpty() 
                    && !"quit".equalsIgnoreCase(text)) {
                logger.info(text);
            } else {
                System.out.println("Done!");
                break;
            }
        }
    }
}

以下をコンソールに出力します。

root.level INFO
FileHandler.level ALL
Enter text: hello
Nov 22, 2016 10:39:19 AM java.util.logging.LogManager$RootLogger log
INFO: hello
Enter text: quit
Done!

ファイルシステムには以下がloggedText.txt含まれています:

Nov 22, 2016 10:39:19 AM java.util.logging.LogManager$RootLogger log
INFO: hello

正常に終了できない場合はFileHandler.close()、作成したハンドラーを明示的に呼び出す必要があります。

注: ログに記録されたクラス名とメソッド名は正しくありません。これはJDK-8152389として知られています。

于 2016-11-22T16:53:09.150 に答える