10

JRE 1.7を実行している他のコンピューターにアプリケーションをデプロイすると、アプリケーションがクラッシュする問題が発生します。これをPCのNetBeans内で(またはJARファイルから直接)実行すると、すべて問題ありません。ただし、別のコンピューターでは、実行中の特定のイベント(ボタンのクリック)で失敗します。

そこで、log4jライブラリを使用したロギングについて学びました。これにより、アプリケーションの問題に関する情報が得られ、ログは完全に機能します。これも私のコンピューターで行われます。しかし、JRE(Java 7 Update 17)のみを実行している他のコンピューターにJARファイルをデプロイすると、ログファイルの痕跡が見つかりません。

これが私のlog4j.propertiesファイルです:

 # Root logger option 
 log4j.rootLogger=INFO, file, stdout  

 # Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender
 log4j.appender.file.File=C:\logging.log
 log4j.appender.file.MaxFileSize=1MB
 log4j.appender.file.MaxBackupIndex=1
 log4j.appender.file.layout=org.apache.log4j.PatternLayout
 log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}
 %-5p %c{1}:%L - %m%n  

 # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.Target=System.out
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}
 %-5p %c{1}:%L - %m%n

私のコンピューターでは、プロジェクトフォルダー内にlogging.logファイルが表示されます。その範囲で、すべてが完全に機能します。ただし、ユーザーPCには、このファイルの兆候はまったくありません。C:\(私が思っていた場所)、C:\ Program Files(x86)\、またはその他の場所にはありません。ハードディスクを完全に検索しましたが、何も返されません。

このファイルはどこに保存する必要がありますか?プロパティは正しく設定されていますか?非常に混乱...

ありがとうございました!

4

1 に答える 1

6

誰かがこの投稿につまずいた場合に備えて、私はそれをどのように解決したかを文書化したいと思いました。

まず、DwBが正しく指摘しているように、問題は、ユーザーのアカウントにlogging.logファイルを作成するための十分な権限がないことでした。私のコードには、実行中のcatchブロックがあり、ファイル書き込みエラーが発生した場合にシステムを終了するためのコードが含まれていました。まさにロギングの詳細が私が書き込もうとしていたものだったので、問題の原因としてこれを手がかりにするための出力を取得できませんでした。

これに気付いたら、ログファイルを書き込んでいる場所を変更する必要がありました。ルート(C:\)またはjarファイルがあったフォルダー(C:\ Program Files \)に書き込むのではなく、どちらもユーザーが完全な特権を持つことを保証できない場所であると判断しました。 AppDataパスにフォルダーを作成します。

私のプログラムの最初の行は、この関数の呼び出しです(一般名MyProgramを使用)。

private static void makeAppDataFolder() {
     File dir = new File(System.getenv("APPDATA") + "\\MyProgram");
     if (!dir.exists()) {dir.mkdir();}
}

これにより、\ AppData\RoamingのユーザーアカウントにMyProgramというフォルダーが作成されます。このパスはユーザーアカウントパスの一部であるため、ユーザーはいつでもこのパスに書き込むことができ、それによって権限の問題を解決できると思います。誰かが他のことを知っているなら、私に知らせてください。

次に、log4j.propertiesファイルで行を変更します

log4j.appender.file.File=logging.log

log4j.appender.file.File=${user.home}/Application Data/MyProgram/logging.log 

これにより、ファイルは先ほど作成したフォルダーに移動します。

これを実行し、適切に配置されたログメッセージを追加すると、他の問題を見つけることができ、すべてが正常に機能するようになりました。

これが誰かの助けになることを願っています。誰か提案があれば、投稿してください。

于 2013-03-27T19:45:44.393 に答える