17

私はこのようにしたい:

<appender name="ErrorLog" class="org.apache.log4j.FileAppender">
        <param name="File" value="${error.log.path}"/>
        <param name="Append" value="true" />
        <param name="Threshold" value="ERROR"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%C{1} %L [%t] %d{dd MMM,yyyy HH:mm:ss.SSS} %-5p - %m%n" />
        </layout>
    </appender>

この行に注意してください:<param name="File" value="${error.log.path}"/>

私は次のように値を設定しようとしました:

public static void main(String[] args) {
     System.setProperty("error.log.path", "/test/crm/log/error.log");
     ApplicationContext context = new ClassPathXmlApplicationContext("blah.xml");
     ..........
     .......... 
  }

しかし、効果は見られません。

メソッドを呼び出す前にlog4jが構成されていますmainか?

これを行う他の方法はありますか?

4

6 に答える 6

10

このスレッドを見てください

あなたはすべてを正しくやったようです。System.setProperty()実際のlog4jの初期化の前に発生する限り、メインクラス内でプロパティを設定することとコマンドラインで指定することの間に違いはないと思います。

あなたの問題は、プロパティを指定する前にロギングフレームワークがロードされることだと思います。設定ツールを呼び出すと、ロギングフレームワーク(log4j)が設定されると言えます。のようなものBasicConfigurator.configure()(あなたの場合、そのxml configurator)。

そうしないと、ログを最初に使用しようとすると、「log4jが正しく構成されていません」などのメッセージが表示されます。

本当の問題は、「main」を含むコードスニペットが過度に単純化されていないかどうかです。

これを念頭に置いて、私が尋ねなければならない別の質問-あなたがいくつかのコンテナ内で実行しているのか、それとも実際のバニラメソッドメインを実行してすべてを自分で構成しているのか?コンテナで実行している場合、コンテナがそれ自体で何らかの形でロギングを設定する可能性があるため、質問しています。たとえば、JBossが設定します。この場合、さらに調査が必要です。

お役に立てれば

于 2013-01-15T08:03:36.953 に答える
4

システムプロパティは${user.home}として使用できます。ここから必要なものを選択してくださいhttp://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

例 :

<appender name="errorLog" class="com.qait.logger.IOPFileAppender">
    <param name="Threshold" value="ERROR" />
    <param name="File"
        value="${user.home}/Harvestors/IOP Error Logs/error.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d%-5p  [%c{1}] %m %n" />
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="ERROR" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>
于 2014-04-01T13:22:47.920 に答える
3

アペンダーを実用的に構成することでそれを行うことができます

  FileAppender fa = new FileAppender();
  fa.setFile("/test/crm/log/error.log");
  fa.setLayout(new 
   PatternLayout("%C{1} %L [%t] %d{dd MMM,yyyy HH:mm:ss.SSS} %-5p - %m%n"));
  fa.setThreshold(Level.ERROR);
  fa.setAppend(true);
  fa.activateOptions();
  Logger.getRootLogger().addAppender(fa);
  // similarly you can add all appenders.

 // or just append file name alone 
 Logger log = Logger.getLogger(YourClass.class);
 FileAppender appender = (FileAppender) log.getAppender("ErrorLog");
 appender.setFile("appender");
于 2013-01-15T07:31:55.987 に答える
1

「sys:」プレフィックスを介したプロパティへのアクセス。

例:

        <param name="File" value="${sys:error.log.path}"/>

詳細については、次のリンクをたどってください:https ://logging.apache.org/log4j/2.x/manual/lookups.html

于 2021-06-25T06:21:16.453 に答える
0

ここでは、システムプロパティの設定は有効になりません。実行中にJavaに引数として渡す必要があります。試す

 java -Derror_log_path=/test/crm/log/error.log

注:ドットが機能するかどうかわからない.ため、アンダースコアに置き換えて_ください。

于 2013-01-15T07:35:16.887 に答える
0

Mavenドキュメント:

システムプロパティ。形式は${sys:some.property}と$ {sys:some.property:-default_value}です。

Mavenプロパティ置換から

于 2020-05-18T02:36:06.190 に答える