4

実行可能な JAR ファイルとしてユーザーに配布されているかなり単純な Java アプリケーションがあります。使用状況を追跡し、診断を支援するために、アプリケーションにロギング機能を追加したいと考えていますが、ある実行から次の実行まで、ユーザーがこのアプリケーションをどこで実行するかはわかりません。

これを機能させるために、log4j ソケット アペンダーを使用するようにアプリケーションを構成しました。ユーザーがこのアプリケーションを実行している場所に関係なく、メッセージはソケットに送信され、適切にログに記録されます。これは完璧です。

ただし、現在実行しているのは、ローカルで実行しているときと、このアプリケーションを運用環境にデプロイしているときとで異なる log4j 構成を使用したいということです。(私の IDE、IntelliJ から) ローカルで実行する場合、いくつかの理由からコンソール アペンダーを使用することを好みます。

  1. 何が起こっているかを見るのは簡単です。
  2. インターネット接続なしで開発する必要がある場合、接続できないことでハングアップしたくありません。
  3. 開発中に行っていることで本番ログを乱雑にしたくありません。

ただし、アプリケーションをパッケージ化して配布するときは、コンソール アペンダーではなくソケット アペンダーを使用したいと考えています。

私が望むことを達成する簡単な方法はありますか? 私は Maven を使用してアプリケーションを構築していますが、それほど熟練していません。

4

3 に答える 3

4

これがあなたの問題に対するより簡単なアプローチです...

次のように、 2 つの log4j.properties ファイルをsrc/main/resourcesディレクトリの下に置きます。

src/main/resources
|- log4j.properties 
|- log4j_dev.properties 

log4j.properties標準のファイル名を使用しているため、Log4J はデフォルトでこのファイルを自動的に取得します。

log4j_dev.properties開発構成が含まれています。IntelliJ が開発中にこれを確実に取得するには、-Dlog4j.configuration=<configuration-file>VM オプションを使用してログ構成を上書きします。IntelliJ を使用してこれを構成する方法のスクリーンショットを添付しました:-

ここに画像の説明を入力

于 2012-11-16T15:54:11.907 に答える
4

これは、当初の予想よりも簡単であることが判明しました。Vikdor のコメントにより、正しい答えにたどり着きました。複数のプロファイル (1 つは開発用、もう 1 つは製品用) を持つことを検討し始めましたが、実際には 2 つ持つ必要がないことに後で気付きました。ローカルで作業しているときは、実際には Maven ビルド プロセスを実行していませんでした。Java クラスを実行しているだけでした。私が Maven ビルド プロセスを実行したのは、デプロイ用にアプリケーションをパッケージ化するときだけでした。そのため、maven-antrun-plugin を使用するセクションを POM ファイルに追加しただけです。私の最終的なコードは次のようになりました。

ファイル: log4j.properties:

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

ファイル: log4j_production.properties

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A2

log4j.appender.A2=org.apache.log4j.net.SocketAppender
log4j.appender.A2.remoteHost=my.server.com
log4j.appender.A2.port=6000
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

ファイル: POM.xml

...
<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <tasks>
                            <delete file="${project.build.outputDirectory}/log4j.properties"/>
                            <copy file="src/main/resources/log4j_production.properties"
                                  toFile="${project.build.outputDirectory}/log4j.properties"/>
                        </tasks>
                    </configuration>
                </execution>
            </executions>
        </plugin>
...

それはトリックを行うように見えました。ローカルで実行するときは、log4j.properties をロードします。これにより、コンソール アペンダーが提供されます。製品ディストリビューション用にパッケージ化すると、Maven はデフォルトの log4j.properties ファイルを、ソケット アペンダーを使用する別のファイルに置き換えます。

ありがとう!

于 2012-11-15T15:08:52.947 に答える
3

ビルド時ではなく実行時に決定することを強くお勧めします。

たとえば、アプリを実行しているとき、config/ディレクトリをクラスパスの先頭に配置し、log4j.xmlそこに自分を配置します。もちろん、log4.xmlアプリケーションの JAR にデフォルトを保持しておくこともできます。これにより、デプロイメントでデフォルトを提供しなくても、アプリケーションは引き続き実行できます。

于 2012-11-14T02:51:36.957 に答える