これは少し奇妙ですが、私は logging パッケージとそのプロパティの使用に不慣れです。グーグルで見つけることができるすべての質問は、「ログを複数のファイルで開く方法は?」です。しかし、今日の私の質問は、複数のファイルを同時に処理しないようにする方法です。どうぞ...
まず最初に、このプロジェクトは java.util.logging の使用に制限されています。いいえ、log4j やその他のサードパーティ パッケージに切り替えることはできません。はい、それらがより優れているはずであることはわかっています。:-)
したがって、このアプレットが起動すると、次のコードが実行されます。
import java.util.logging.Logger;
import java.util.logging.LogManager;
// in startup routine:
LogManager.getLogManager().readConfiguration(
this.getClass().getResourceAsStream("/logging.properties"));
プロパティファイルをJARから引き出して適用すると、うまくいきます。はreadConfiguration()
、VM の起動からすべての既存の設定をリセットすることになっています。プロジェクトの残りの部分には次のような行があります
private final static Logger LOGGER = Logger.getLogger(NameOfClass.class.getName());
これはかなり標準的だと思います。すべてのクラスは同じパッケージ (たとえば、TheProject と呼びます) にあり、ファンキーなログ名/プロパティ階層は同じ規則に従っています。
logging.properties ファイルは、Java 6 SE JRE に同梱されているもののコピーとして開始され、その後変更されました。次のようになります。
handlers=java.util.logging.FileHandler,java.util.logging.ConsoleHandler
# Default global logging level.
.level=INFO
# Loggers
# ------------------------------------------
# Loggers are usually attached to packages.
# Here, the level for each package is specified.
# The global level is used by default, so levels
# specified here simply act as an override.
java.level = INFO
javax.swing.level = INFO
sun.awt.level = INFO
theproject.level = ALL
# Handlers
# -----------------------------------------
theproject.handlers=java.util.logging.FileHandler
# Override of global logging level
java.util.logging.FileHandler.level=ALL
# Naming style for the output file:
java.util.logging.FileHandler.pattern=/path/to/logfiles/TheProject%u.%g.log
ログメッセージがJavaコンソールに表示され、ディスクファイルにも表示されるという点で、すべて「機能」します。ここで奇妙な点があります。アプレットが実行されるとすぐに、 TheProject0.0.log と TheProject1.0.log の両方の2 つのファイルが同時に開かれます。ログ メッセージが発生すると、両方のファイルに同時に表示されます。両方のファイルは、最大サイズに達し、(両方!) ローテーションされる場合を含め、常に互いの正確なコピーです。
一度に 1 つの JRE VM しか実行されていないことを確認しました。
いつでも、両方のファイルが開かれているか、両方が閉じられているかを確認しました。一方が他方よりも長いまたは短い時間開いているわけではありません。
2 つのファイル名の間で異なる %u トークンは、ログファイルが別のプロセスによって既に開かれている場合に備えて、「競合を解決するための一意の番号」として文書化されていますが、両方のログが同一のデータを取得していて何も取得していないため、ここではそうではないと思います。それ以外の場合はファイルを開きます。(証拠: Windows では、VM の実行中はどちらのファイルも削除できませんが、VM が最終的に終了すると削除されます。)
プロパティファイルで何かばかげたことをしているのですか、それともプロパティを正しくロードする方法を誤解していますか...?