我们正在使用Log4j登录我们的Web应用程序。我们的应用程序部署在Websphere集群环境中。
例如:
有一台主机具有两个不同的JVM,其中部署了Web应用程序。
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配置不应该更新?
答案 0 :(得分: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中使用带有查找文件名的Appender:
<appenders>
<File name="MyFile" fileName="${sys:logFilename}.log">
<PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>