3

次のコードを実行して、Java でロガーを作成しています。


private static final String logFile = "." + File.separator + "Log Files" + File.separator + "Log_" + Long.toString(System.currentTimeMillis());
private static Logger logger = Logger.getLogger("JCS_Logger");
static
{
    try
    {
        logger.addHandler(new FileHandler(logFile ));
    }
    catch (Exception e)
    {
       System.err.println("Could not return a static logger");
    }
}

このロガーを使用すると、System.err だけでなくファイルにも書き込みます。最終的には、次の場所に書き込みできるようにロガーを構成したいと考えています。

  1. System.err と File の両方
  2. System.err と File のどちらでもない
  3. ただSystem.err
  4. ジャストファイル

呼び出すlogger.setLevel(Level.OFF)とすべてのログがオフになることはわかっていますが、上記のリストに対してそれを行う方法がわかりません。それはLevelクラスを通して行われますか? アイデアや提案は大歓迎です。

編集:回答ありがとうございます。私はこのコードでそれを解決しました:


    /**
     * If debug should be turned on
     */
    static boolean debug = true;
    /**
     * If writing debug to file
     */
    static boolean writeLogToFile = false;
    /**
     * If writing debug to System.err
     */
    static boolean writeLogToStdErr = true;

    /**
     * Location for the temp file
     */
    private static final String logFile = "." + File.separator + "Log Files" + File.separator + "Log_" + Long.toString(System.currentTimeMillis());
    /**
     * Instance of the logger
     */
    private static Logger logger = Logger.getLogger("JCS_Logger");
    /**
     * Handler for System.err
     */
    private static Handler consoleHandler;
    /**
     * Handler for the log file
     */
    private static Handler fileHandler;

    static
    {
        try
        {   //if not debuggin at all          
            if(debug == false)
            {
                logger.setLevel(Level.OFF);
            }
            //if not writing to the file
            if(writeLogToFile == true)
            {
                fileHandler = new FileHandler(BCApp.getLogFileHandlerPath());
                logger.addHandler(fileHandler);
            }
            //if not writing to System.err
            if(writeLogToStdErr == false)
            {
                consoleHandler = logger.getParent().getHandlers()[0];
                logger.getParent().removeHandler(consoleHandler);
            }
        }
        catch (Exception e)
        {
            System.err.println("Could not return a static logger");
        }
    }

助けてくれてありがとう

4

3 に答える 3

2

必要なアイテムに対してのみハンドラーを追加して、ログの起動時に選択することができます。または、すべてのハンドラーを追加し、ロギングしきい値を介して各ハンドラーを調整できます。

ハンドラーのログしきい値を調整するには、次を使用しますhandler.setLevel(...);

起動時に、デフォルトのハンドラーがすでに構成されていることに注意してください。実装するログハンドラーの「処理」の手法によっては、プログラムでそのハンドラーを削除するか、何も処理しないように調整する必要がある場合があります。

于 2010-12-08T21:53:35.770 に答える
1

そのクラスのAPIドキュメントを参照してください:Logger(Java Platform SE 6)

removeHandler(Handler)メソッドを使用してハンドラーを削除できるため、たとえば、コンソールにのみ出力する場合は、このメソッドを呼び出してFileHandlerを削除できます。

他の方法もあります。異なるアプローチを取り、ハンドラーごとにフィルターを設定すると、出力されるはずのないメッセージが破棄されます。たぶん、フォーマットをいじってみてください。

于 2010-12-08T21:54:22.603 に答える
0

コードをまったく書かなくても、目的の構成を実現できたはずです。方法は次のとおりです。 システムに Java がインストールされているディレクトリを参照します。

  1. jre/lib (Windows では jre\lib) サブディレクトリに移動し、「logging.properties」ファイルを探します。存在しない場合は作成できます。

  2. "handlers = " TO という内容の行を編集します

    - System.err と File の両方の場合

    "handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler"
    

    - System.err と File のどちらでもない

    Simply comment that line by adding # in the beginning of the line.
    

    -System.err のみの場合

    "handlers = java.util.logging.ConsoleHandler"
    

    -ジャストファイル用

    "handlers = java.util.logging.FileHandler"
    

終わり!ロギングを開始する準備ができました :)

于 2013-05-08T18:32:26.480 に答える