<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才兼容所有  回復  更多評論   

    主站蜘蛛池模板: 亚洲国产精品成人网址天堂| 亚洲黄色中文字幕| 亚洲国产成人一区二区精品区| 亚洲一区二区三区91| 九九热久久免费视频| 成人毛片18女人毛片免费视频未| 亚洲精品无码不卡在线播放HE| 亚洲JLZZJLZZ少妇| 91高清免费国产自产| 亚洲真人无码永久在线| 亚洲精品视频专区| 中文字幕日本人妻久久久免费| 免费一级毛片不卡不收费| 亚洲综合精品第一页| 国产免费一区二区三区| 亚洲an天堂an在线观看| 久久99精品免费一区二区| 亚洲精品无码专区在线在线播放 | 337p日本欧洲亚洲大胆色噜噜 | 一级毛片免费不卡在线| 久久精品亚洲男人的天堂 | 99在线在线视频免费视频观看 | 亚洲国产另类久久久精品小说| 日本免费中文字幕| 国产亚洲真人做受在线观看| 97av免费视频| 91久久亚洲国产成人精品性色 | 国产亚洲av人片在线观看| 嫩草在线视频www免费观看| 亚洲一区二区三区不卡在线播放| 国产在线a不卡免费视频| 国产精品亚洲专区无码牛牛 | 嫩草在线视频www免费观看| 亚洲中文字幕乱码熟女在线| 亚洲中文字幕丝袜制服一区| aa午夜免费剧场| 久久精品国产亚洲麻豆| 久久精品a一国产成人免费网站| 久久亚洲精品专区蓝色区| 成年女人免费视频播放体验区| 一级做α爱过程免费视频|