2013-02-15 44 views
2

我們使用Log4j來登錄我們的Web應用程序。我們的應用程序部署在Websphere集羣環境中。在Websphere Clustring環境中分離Log4j日誌

例如:

存在具有其中Web應用程序部署了兩個不同的JVM中一臺主機。

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

Log4j配置爲的App-1是:

<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日誌被寫在同一個文件/家庭/ applogs /應用-1.log

有什麼辦法可以爲集羣環境配置單獨的日誌文件嗎?爲了在我們將應用程序部署在1個JVM或2個JVM或3個JVM或其他的應用程序中,我的Log4j配置不應該更新?

回答

0

您可以使用ManagementFactory.getRuntimeMXBean().getName()在運行時查找JVM的ProcessID以獲取唯一的fileName,然後您需要以某種方式在記錄器的運行時更新fileName。看看this Answer來做到這一點。在完成:

添加到您的主方法:

//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> 
+0

感謝您的答覆。 – 2013-03-13 06:57:10

+0

我們做的方式有點不同,設置JVM自定義屬性說**「logging.log4j.location =/home/applogs/{WAS_SERVER_NAME}」**,我們可以在log4j配置中使用這個屬性說** ** – 2013-03-13 07:05:55