3

Web アプリケーションへのログインに Log4j を使用しています。当社のアプリケーションは、Websphere クラスター環境にデプロイされています。

例えば:

Web アプリケーションがデプロイされる 2 つの異なる JVM を持つ 1 つのホストがあります。

Host-1      
  JVM -1 [App-1, App-2]
  JVM -2 [App-1, App-2]

App-1 のLog4j 構成は次のとおりです。

<log4j:configuration debug="true">
    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
        <appender-ref ref="FileOut" />
    </appender>
    <appender name="FileOut" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="/home/applogs/app-1.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="10MB" />
        <param name="MaxBackupIndex" value="5" />
        <param name="Threshold" value="ALL" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d %-5p - %m%n" />
        </layout>
    </appender>   
    <root>
        <level value="INFO" />
        <appender-ref ref="ASYNC" />
    </root>    
</log4j:configuration>

しかし、ここでの問題は、異なる JVM ログが同じファイル/home/applogs/app-1.logに書き込まれていることです。

クラスタリング環境用に個別のログ ファイルを構成する方法はありますか? 1 つの JVM または 2 つの JVM または 3 つの JVM などにアプリケーションをデプロイする場合に Log4j 構成を更新しないようにするには?

4

1 に答える 1

0

実行時に JVM の ProcessID を検索して一意の fileName を取得するために使用できますManagementFactory.getRuntimeMXBean().getName()。その後、ロガーの実行時に fileName を更新する必要があります。これを行うには、この回答をご覧ください。不完全な:

メインメソッドに追加します:

//set a property to the JVM-Name
System.setProperty("logFilename", ManagementFactory.getRuntimeMXBean().getName());
//update the Logger context to relead the filename with the lookup
LoggerContext ctx =  (LoggerContext) LogManager.getContext(false);
ctx.reconfigure();

log4j2.xml で、ファイル名のルックアップを含むアペンダーを使用します。

<appenders>
<File name="MyFile" fileName="${sys:logFilename}.log">
    <PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
于 2013-03-08T19:44:32.020 に答える