2

myApp.jar という jar ファイルがあるとします。jar ファイルは 4 つのアプリケーションで構成されています。jar ファイル内の 4 つのアプリケーションはすべて、jar ファイル内で同じコードを使用します。唯一の違いは、データの抽出方法と変換方法です。jarファイル内のパッケージは次のようになります

com.myapp
    |-App1Main.java
    |-App2Main.java
    |-App3Main.java
    |-App4Main.java
com.myapp.transform
    |-App1Transform
    |-App2Transform
    |-App3Transform
com.myapp.service
    |-MyAppService.java
com.myapp.model
    |-{ModelClasses}
com.myapp.dao
    |-MyAppDAO

唯一の違いは、各アプリケーションが異なるアルゴリズムのセットを使用して、異なるソースからのデータを変換/変換することです。データが変換されると、サービス、dao、モデル クラスはすべて異なるアプリケーション間で共有されます。アプリケーションは、このようなコマンドを使用して実行されます

$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java

jar ファイルには、3 つのアプリケーションすべてで使用される log4j.propeties ファイルが含まれています。

log4j.rootLogger=WARN, stdout, myAppLogger
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppLogger.File=/myapp/logs/myapp.log
log4j.appender.myAppLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppLogger.DatePattern=.dd-MM-yyyy
log4j.appender.myAppLogger.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.myAppLogger=org.apache.log4j.DailyRollingFileAppender

現時点では、上記の構成は、jar ファイル内の 3 つのアプリケーションのそれぞれがすべて同じログ ファイル (つまり /myapp/logs/myapp.log) に書き込むことを意味します。各アプリケーションが独自のログに書き込むように、これを変更したいと考えています。ファイル。

私が見つけた解決策の 1 つは、ログ ファイルの構成を次のように変更することです。

log4j.appender.myAppLogger.File=/myapp/logs/${logfile.name}

次に、以下に示すように、異なるログファイル名をシステム プロパティとして使用して各アプリケーションを呼び出します。

$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp1Log.log
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp2Log.log
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp3Log.log
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp4Log.log

上記はおそらく機能しますが、システムプロパティの使用にはあまり熱心ではありません。複数のロガーを使用して同じことを達成する方法はありますか?

複数のロガーをセットアップし、アプリケーション内で関連するロガーを呼び出すことができることはわかっていますが、いくつかのクラスで現在どのアプリケーションが実行されているかを知る方法がないという問題があります。例えば..

複数のロガーをセットアップする

log4j.rootLogger=WARN, stdout,MyApp1, MyApp2, MyApp3, MyApp4 
# setup MyApp1
log4j.appender.myAppLogger=org.apache.log4j.RollingFileAppender
log4j.appender.myAppLogger.File=/myapp/logs/myapp1.log
...
...
# setup MyApp4
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.myAppLogger.File=/myapp/logs/myapp4.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

MyAppService クラスと MyAppDAO クラスは、4 つのアプリケーションすべてで使用されます。MyAppService または MyAppDAO でログ ファイルに書き込みたい場合は、次のようにする必要があります。

- import all 4 loggers in MyAppservice
- if the application is myapp1 use myapp1 logger
- if the application is myapp2 use myapp2 logger
- if the application is myapp3 use myapp3 logger
- if the application is myapp4 use myapp4 logger

上記もおそらく機能しますが、コード内のいくつかの場所に複数の if ステートメントがあると、あまりきれいではありません。

IFステートメントを使用したり、メソッド内でアプリケーションの名前を渡したりする必要のない、よりクリーンでより一般的なアプローチを探しています。より良い提案はありますか?

4

2 に答える 2

2

すべてのクラスが同じファイルにログインする必要がありますが、ファイルの名前はエントリ ポイントに依存する必要があります。それぞれの Main クラスで、次のことができます。

  • アペンダーをプログラムで設定し、ルート ロガーに追加します。
  • または、別のプロパティ ファイルをロードします。
  • または、ファイル名を含むシステム プロパティを設定します (コマンド ラインで設定する代わりに)。
于 2013-04-12T14:41:34.123 に答える