log4j 多进程配置要注意的

多进程写日志文件

方法一:

解决log4j公用配置文件,多进程同时写同一个log文件,因存在操作系统pv操作问题, 导致部分日志丢失。解决方案是不同的进程写不同的log文件

测试于:Log4j 1.2.15 | CentOS 5.7

假设有个一个web项目,项目中同时包含一些app,这些app是是需要用java命令来启动的。
每启动一个app就相当于启动一个虚拟机,即一个进程。

问题一:如果公用项目中的log4j,那么必然多进程同时同一个log文件,存在操作系统pv操作问题,
导致部分日志丢失。
问题二:如何实现在代码,log4j等配置文件公用的情况下,不同的进程写不同的log文件?

解决方法:

  1. 在app 用java命令启动的时候增加-D参数。
    假设是Linux 下Java启动脚本中的脚本,只需修改JAVA_OPTS值,即

JAVA_OPTS="-Xms64m -Xmx512m -Djava.awt.headless=true -Dlog4j.log.app=app1"

  1. 在log4j的配置文件中调用此变量
    假设是Log4j 实例配置解析中的配置,需要修改log4j.appender.F.file值,即

log4j.appender.F.file = /logs/basic/${log4j.log.app}/log

假设web项目中有两个app,app1和app2
各自的启动脚本中配置为-Dlog4j.log.app=app1和-Dlog4j.log.app=app2
tomcat启动jvm并没有配置,所以log4j会默认为空,log目录效果如下

app日志会放在相应的app*目录下
web日志由于没有得到-D配置,会放在和app*目录平级的位置,当然如果需要的也可以修改tomcat bin下的catalina.sh,增加-D参数,但为了让项目和web服务器解耦,不推荐这么做。

当然有人可能会说,可以用在启动java进程时将日志重定向到指定的文件中,如

nohup java $JAVA_OPTS $MAIN_CLASS $* > /logs/basic/app1/log &

这种方法的缺点是不能实现日志的自动切割,不能避免日志不断增大甚至占满磁盘的问题。

如过此内容对您有帮助,欢迎以点击广告的形式来支持我们,但请每天不要多于一次,否则可能被识别恶意点击,导致封号。

 

 

方法二

1.log4j代码片段(log4j的配置文件支持System Property的环境变量的获取)

  <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">

<param name="File" value="D:/${weblogic.Name}ank.log" />

<param name="DatePattern" value="'.'yyyy-MM-dd-HH" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%-5p %c{1} %m%n" />

</layout>

</appender>

 

2.${weblogic.Name}对应的是JAVA启动时环境变量;

看startWebLogic.sh中的代码片段

D:ea92JDK150~1injava -client   -Dweblogic.Name=AdminServer 

如何设置JAVA启动时的环境变量:

java  -D<参数>=<值>

 

 

3.使用spring中的Log4jConfigListener把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。 

  log4j.xml配置片段:

 

Java代码  

  1. <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">  
  2. lt;param name="File" value="${webapp.root}/WEB-INF/logs/${weblogic.Name}-jrwwg.log" />  
  3.     <param name="DatePattern" value="'.'yyyy-MM-dd-HH" />  
  4.     <layout class="org.apache.log4j.PatternLayout">  
  5.         <param name="ConversionPattern" value="%-5p %c{1} %m%n" />  
  6.     </layout>  
  7. </appender>  

 

   web.xml配置片段

  

Xml代码  

  1.     <context-param>  
  2.         <param-name>log4jConfigLocation</param-name>  
  3.          <param-value>/WEB-INF/classes/log/log4j.xml</param-value>  
  4.     </context-param>  
  5.   
  6. <!---定时扫描loj4j配置文件的变化---->  

    <context-param>   

        <param-name>log4jRefreshInterval</param-name>   

        <param-value>6000</param-value>   

    </context-param> 

Xml代码  

  1. <listener>  
  2.        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  3.    </listener>  

 

 

 

自己实践

用方法一配置 -Dlog4j.log.app=app1  时,

在 下图中是可以实现的:

 

 

但是在 weblogic中的 server start中 配置 不起作用,如下图:

 

用方法二 完美的解决了问题。

原文地址:https://www.cnblogs.com/daipenglin/p/4989924.html