zoukankan      html  css  js  c++  java
  • 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中 配置 不起作用,如下图:

     

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

  • 相关阅读:
    关于隐藏元素高度的问题 css visibility:hidden 与 display:none的区别
    三星R428 内存不兼容金士顿2G DDR3
    IE (6-11)版本,在使用iframe的框架时,通过a标签javascript:; 和js跳转parent.location的时候 出现在新页面打开的情况
    按键精灵 vbs 获取网页源码 xp系统被拒绝
    threejs 组成的3d管道,寻最短路径问题
    javaweb部署多个项目(复制的项目)
    添加无登录权限的SSH用户命令
    Using Blocks in iOS 4: Designing with Blocks
    Using Blocks in iOS 4: The Basics
    Understanding Objective-C Blocks
  • 原文地址:https://www.cnblogs.com/daipenglin/p/4989924.html
Copyright © 2011-2022 走看看