4

一連のファイルをスキャンするアプリケーションがあります。そして、このスキャンは並行して行われます。つまり、5 つのファイルをアップロードすると、5 つのプロセスが作成され、ジョブが並行して実行されます。現在、実行中のジョブの例外を記録するために、ログ ファイルは 1 つだけです。来ている問題は、ロガーが多くのログファイルを次のように作成することです-

mylogfile.log(actual log file)

mylogfile.log.1

mylogfile.log.2

mylogfile.log.3

mylogfile.log.4

mylogfile.log.5
...

それぞれのロックファイルで。以下は、私が使用したコードスニペットです。

  public static Logger getLogger(final String className) {
    final Logger logger = Logger.getLogger(className);
    FileHandler fh;
    try {
        // This block configure the logger with handler and formatter
        fh = new FileHandler("mylogfile.log", true);
        logger.addHandler(fh);
        logger.setLevel(Level.ALL);
        logger.setUseParentHandlers(false);
        fh.setFormatter(new SimpleFormatter());
    } catch (final SecurityException e) {
        //          }
    } catch (final IOException e) {
        //
    }
    return logger;
}

並行して実行されているすべてのジョブの例外を書き込むために 1 つのログ ファイルのみを使用するようにするにはどうすればよいでしょうか..??

ありがとう、

アニッシュ

4

3 に答える 3

1

これは、並列呼び出しとはあまり関係がありません。同様に、getLoggerを呼び出すたびに(引数と同じ文字列を使用する場合でも)単一のスレッドから、新しいFileHandlerを作成し、それを既存のロガーに追加します。getLoggerを呼び出すたびにすべてのセットアップを実行したくない場合があります-方法。

//now we will create new Filehandler and set it to logger
getLogger("identifier").log(Level.SEVERE, "Log to   one file");
//now we have already one filehandler, but lets add one more
getLogger("identifier").log(Level.SEVERE, "Log to   two files");
//now we have already two filehandlers, but lets add one more
getLogger("identifier").log(Level.SEVERE, "Log to three files");       

ロギングを一度設定すると、java.util.loggingLogger.getLoggerを介してロガーへの参照を取得できます。Sunの概要では、プロパティファイルを介してログを構成する方法について詳しく説明しています。

于 2009-07-20T17:41:59.117 に答える
1

ロガーを取得できるシングルトン ロケーター クラスを使用できます。これにより、アプリケーションは 1 つのロガーを使用することになります (つまり、ログ ファイルが 1 つになります)。

class LoggerLocator {

    private static LoggerLocator locator = new LoggerLocator();
    private Logger logger;

    /**
     * 
     */
    private LoggerLocator() {
        initLogger();
    }

    /**
     * @return
     */
    public static LoggerLocator getLocator(){
        return locator;
    }

    /**
     * @return
     */
    public Logger getLogger() {
        return logger;
    }

    /**
     * 
     */
    private void initLogger() {
        logger = Logger.getLogger("My General Logger");
        FileHandler fh;
        try {
            // This block configure the logger with handler and formatter
            fh = new FileHandler("mylogfile.log", true);
            logger.addHandler(fh);
            logger.setLevel(Level.ALL);
            logger.setUseParentHandlers(false);
            fh.setFormatter(new SimpleFormatter());
        } catch (final SecurityException e) {
            // }
        } catch (final IOException e) {
            //
        }
    }
}

ジョブでは、次の呼び出しでロガーを取得します。

Logger logger = LoggerLocator.getLocator().getLogger();
于 2009-07-20T22:33:22.180 に答える