1

私の問題は、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 によってロードされます。

どんな助けでも大歓迎です、

前もって感謝します

4

0 に答える 0