<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    讓log4j支持占位符

    目標:讓log4j.xml配置文件中允許使用占位符(${key}).

    使用場景:
    在運行期決定一些動態的配置內容.
    比如在我們項目中,希望一臺物理機同一個應用跑多個實例.
    因為多進程操作同一份log文件存在并發問題(打印,DailyRolling等),所以我希望配置如下:${loggingRoot}/${instance}/project.log
    在運行腳本中,通過加入-Dinstance=instance1參數,來動態指定實例名.讓同一份應用在不同的運行實例下,日志打印到不同的路徑

    Log4j分析:
    我以為,Log4j天生就支持占位符的.請見:org.apache.log4j.helpers.OptionConverter.substVars(String val, Properties props)就有對占位符的處理.
    org.apache.log4j.PropertyConfigurator (log4j.properties文件解析).默認就支持對占位符的處理.
    org.apache.log4j.xml.DOMConfigurator挺怪異的.明明也有對占位符的處理.但是我們就是無法對其屬性props進行賦值.
    (當然,有可能是我誤解了其props的用法--還沒有完整讀過他的源碼)

    處理方案:
    繼承org.apache.log4j.xml.DOMConfigurator,實現自己的DOMConfigurator.
    public class PlaceHolderDOMConfigurator extends org.apache.log4j.xml.DOMConfigurator {

        
    private Properties props;

        
    public PlaceHolderDOMConfigurator(Properties props){
            
    this.props = props;
        }

        
    public static void configure(String filename, Properties props) {
            
    new PlaceHolderDOMConfigurator(props).doConfigure(filename, LogManager.getLoggerRepository());
        }

        //主要是覆寫這個方案.傳入properties對象
        
    protected String subst(String value) {
            
    try {
                
    return OptionConverter.substVars(value, props);
            } 
    catch (IllegalArgumentException e) {
                LogLog.warn(
    "Could not perform variable substitution.", e);
                
    return value;
            }
        }
    }

    測試代碼:
    log4j.xml片段:
    <appender name="PROJECT" class="org.apache.log4j.DailyRollingFileAppender">
            
    <param name="file" value="${loggingRoot}/${instance}/project.log"/>
            
    <param name="append" value="false"/>
            
    <param name="encoding" value="GB2312"/>
            
    <param name="threshold" value="info"/>
            
    <layout class="org.apache.log4j.PatternLayout">
                
    <param name="ConversionPattern" value="%d [%X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
            
    </layout>
        
    </appender>
    Run.java:
    public static void main(String[] args) {
            Properties props 
    = new Properties();
            props.setProperty(
    "loggingRoot""d:/tmp");
            props.setProperty(
    "instance""instance1");

            PlaceHolderDOMConfigurator.configure(LOG4J_PATH, props);
            Logger rootLogger 
    = LogManager.getRootLogger();
            FileAppender fileAppender 
    = (FileAppender) rootLogger.getAppender("PROJECT");
            System.out.println(fileAppender.getFile());
        }

    輸出結果:
    d:/tmp/instance1/project.log

    當然,你也可以通過在啟動參數中加 -DloggingRoot=xxxx  -Dinstance=yyyy動態指定內容.


    特別說明:
    本文:log4j版本為1.2.14
    log4j 1.2.15測試不通過,原因見:https://issues.apache.org/bugzilla/show_bug.cgi?id=43325

    posted on 2010-07-01 08:52 stone2083 閱讀(12673) 評論(2)  編輯  收藏 所屬分類: java

    Feedback

    # re: 讓log4j支持占位符[未登錄] 2012-10-27 13:41 dd

    setParameter  回復  更多評論   

    # re: 讓log4j支持占位符[未登錄] 2012-10-27 13:42 dd

    重載setParameter才兼容所有  回復  更多評論   

    主站蜘蛛池模板: 精品熟女少妇av免费久久| eeuss影院免费92242部| 91香蕉在线观看免费高清| 亚洲国产精品自在线一区二区 | 免费观看亚洲人成网站| 日日夜夜精品免费视频| 亚洲日本在线电影| 日韩免费无码一区二区视频| 亚洲AV无码资源在线观看| 国产免费怕怕免费视频观看| 美女无遮挡免费视频网站| 免费一级毛片在线观看 | 免费观看一区二区三区| 亚洲AV无码国产精品麻豆天美| 在线观看免费视频网站色| 国产偷v国产偷v亚洲高清| 免费人成黄页在线观看日本| 久久久久亚洲AV无码专区体验| 足恋玩丝袜脚视频免费网站| 亚洲电影免费观看| 97无码免费人妻超级碰碰夜夜| 亚洲国产成人精品无码区花野真一| 国产免费牲交视频| 99在线热播精品免费99热| 亚洲精品熟女国产| 国产精品无码素人福利免费| 一级一级一片免费高清| 亚洲国产综合精品中文第一区| 黄色永久免费网站| 日本一区二区三区在线视频观看免费| 中文字幕亚洲综合久久男男| 91精品国产免费久久国语蜜臀| 亚洲а∨天堂久久精品9966| 亚洲成a人在线看天堂无码| 日本高清免费观看| 国产人成亚洲第一网站在线播放| 亚洲男女内射在线播放| 99免费在线观看视频| 国产精品亚洲lv粉色| 亚洲a一级免费视频| 国产日产成人免费视频在线观看|