3

java.util.logging を使用して、アプリケーション レベルのロガー (weblogic にデプロイされた webapps) を実装しようとしています。

ClassLoaderLogManager はアプリケーション レベルのロギングを既に実装しているため、Apache JULI ロギング システムから取得しました。

だから、これは私のサーブレットコード(SimpleServlet .java)がどのように見えるかです:

ClassLoaderLogManager ClassLoaderLogManager = new ClassLoaderLogManager () ;
String nameoflogger = SimpleServlet.class.getName() ;   
boolean status = ClassLoaderLogManager .addLogger(nameoflogger);   
if(status) 
{
     Logger logger = ClassLoaderLogManager .getLogger(nameoflogger);   
     logger.log(Level.FINEST, "testing SimpleServlet FINEST");
     logger.log(Level.INFO, "testing SimpleServlet INFO");
     logger.log(Level.SEVERE, "testing SimpleServlet SEVERE");   
}    
ClassLoaderLogManager .reset();  

そして、次のように java_home/jre/lib に logging.properties ファイルがあります

handlers= java.util.logging.FileHandler

#.level= INFO

# default file output is in user's home directory.

java.util.logging.FileHandler.pattern = %h/java_%g.log
java.util.logging.FileHandler.limit = 200
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.append  = true
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter


# Limit the message that are printed on the console to INFO and above.
#java.util.logging.ConsoleHandler.level = INFO
#java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

package8.SimpleServlet.handler = java.util.logging.FileHandler

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
package8.SimpleServlet.level = SEVERE

したがって、webapp を実行すると、webapp にアクセスすると、java_0.log、java_1.log (ログ ファイルのローテーション) などが作成されると予想されます。しかし、 java0.log.lck, java1.log.lck も見ています。

ログ ファイルには、予想どおり SEVERE レベルのログのみが表示されます。

なぜこれが起こるのですか?Java コード側でハンドラーを作成している場合、ハンドラーを閉じると問題が解決します。購入はこちらで取り扱っていますか?

それとも、 org.apache.juli.ClassLoaderLogManagerを使用しているときに、org.apache.juli.FileHandlerではなくjava.util.logging.FileHandlerを使用しているためです か??

4

1 に答える 1

3

FileHandler が開いているときに、ロック ファイルが表示されることを期待する必要があります。VM の終了後にそれらが残っている場合は、FileHandler が閉じられていないか、ハンドラー シャットダウン フックの実行中に VM が停止またはクラッシュしたか、またはそれらを削除しようとしたときに I/O 例外が発生したことが原因です。

JDK-8060132が実行されている可能性があります。logging.properties の抽象ノードで構成されたハンドラーが常に適切に閉じられているわけではありません。 関連: JDK-6274920: JDK ロガーは java.util.logging.Logger インスタンスへの強い参照を保持します。

構成を見ると、ルート ロガーに FileHandler がインストールされ、SimpleServlet に FileHandler がインストールされています。ClassLoaderLogManager は JVM グローバルな方法で使用されていないため、ローカルの ClassLoaderLogManager を起動する前に、インストールされたデフォルトの LogManager が FileHandler を作成しています。持っている java_home/jre/lib comfig から FileHandler エントリを削除し、ClassLoaderLogManager.readConfigurationメソッドを使用して webapp ローカル構成をロードします。

于 2013-11-15T16:04:26.943 に答える