私の問題は、jar からファイルにログインするように log4j をセットアップしようとしていることです。この jar は、既に log4j を使用しているアプリケーションで使用されています。私のjarは、log4jに同梱されているmavenパッケージとして作成されています。私は次のようにプロパティファイルからlog4jを初期化しようとしています:
「log4j.プロパティ」
log4j.appender.FileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.FileAppender.File=${user.home}/.myproject/myproject.log
log4j.appender.FileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.FileAppender.layout.ConversionPattern=%d{yy-MM-dd HH:MM:ss,SSS} [%t] %-5p %c %x - %m%n
log4j.appender.FileAppender.MaxFileSize=5MB
#myproject is full package name
log4j.logger.myproject=,FileAppender
このプロパティ ファイルを jar のリソースに含めました。私はコードでそれをロードしています:
try {
InputStream inputStream = this.getClass().getClassLoader()
.getResourceAsStream("log4j.properties");
Properties properties = new Properties();
properties.load(inputStream);
inputStream.close();
PropertyConfigurator.configure(properties);
} catch (NullPointerException e) {
BasicConfigurator.configure();
throw new MyprojectException("log4j.properties not found", e);
} catch (IOException e) {
throw new MyprojectException("log4j.properties could not be loaded", e);
}
log4j を使用するアプリケーションで jar が使用されていない場合、このコードは問題なく動作します。しかし、空のログ ファイルを取得するか、一部のアプリケーションで場合によっては、ログ ファイルがまったく作成されません。
次のような propertyconfigurator ではなく、手動でアペンダーを追加しようとしました。
static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Myproject.class);
SimpleLayout layout = new SimpleLayout();
FileAppender appender = new FileAppender(layout,"C:/out.log",true);
logger.addAppender(appender);
logger.setLevel(Level.DEBUG);
これはうまく機能しているようですが、代わりにプロパティファイルからlog4jを構成したいと思います。
log4j が複数のインスタンスを処理する方法について、多くのスレッドを読みました。プロパティによってロードされた log4j 構成は、1 つのアプリケーションで一度変更すると変更できないことがわかりました。独自の log4j jar と構成を出荷し、propertyconfigurator で構成することを提案する人もいます。2 番目の例が機能し、最初の例が機能しない理由に興味があります。どうすればこの問題を解決できますか?
注:
jar ファイルを使用するアプリケーションの log4jconfigs を変更したくありません。また、使用できる -Dlog4j.configuration システム プロパティがあることもわかりましたが、私の jar は実行可能な jar ファイルではなく、Class.forName によってロードされます。
どんな助けでも大歓迎です、
前もって感謝します