怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨...
生活随笔
收集整理的這篇文章主要介紹了
怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨...
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
?? ??從最初學(xué)習(xí)使用log4j的時(shí)候,網(wǎng)上和書本上主要都是使用“l(fā)og4j.properties”這種屬性格式,配置日志。 多年以來,一直使用這種格式,總的來說,簡(jiǎn)單、夠用。?
? ??而有十多年經(jīng)驗(yàn)的Boss,不建議使用properties格式配置,而是用xml格式配置。Boss之前在阿里(支付寶、淘寶)、UC等大公司工作過。
?? ?我們有個(gè)很明顯的不同:? 我比較注重,簡(jiǎn)單、快速。Boss比較注重,規(guī)范、嚴(yán)謹(jǐn)。
? 我的觀點(diǎn):沒有對(duì)與錯(cuò),只有適用與不適用。每個(gè)人都是根據(jù)自己的經(jīng)歷和追求,做出的技術(shù)選擇。對(duì)于技術(shù)使用者來講,明白不同配置的好處和壞處,才是需要注意的。
? 就log4j.xml這種配置來說,功能確實(shí)可能更多一些,可以單獨(dú)把 業(yè)務(wù)日志和普通的系統(tǒng)日志分離,運(yùn)維過程中,很容易看到業(yè)務(wù)錯(cuò)誤,從而更快的解決問題。
?------------------------------------------------------------------------------------------------------------
? ? ??另外,Boss覺得需要把log4j的輸出目錄 配置 成變量。 比如:<param name="File" value="${log4jOutputPath}/front/default.log" />, log4jOutputPath可以是“C:/log4j/”。
? ?? Boss根據(jù)之前在阿里的工作經(jīng)驗(yàn),開發(fā)和運(yùn)維可能完全是2撥人。開發(fā)只管寫代碼,把代碼寫好,沒有功能和業(yè)務(wù)問題。運(yùn)維,負(fù)責(zé)把代碼部署好,域名解析、Nginx、Tomcat、日志配置。運(yùn)維導(dǎo)致的問題,運(yùn)維背鍋。功能問題,開發(fā)背鍋。職責(zé)分明,流水化作業(yè)。
? ? 我對(duì)這種流水化的作業(yè)是非常認(rèn)同的,這樣的企業(yè)生產(chǎn)效率才高,才能為國(guó)家和社會(huì)創(chuàng)造更多的價(jià)值。
? ?而象武漢一起好等很多在技術(shù)方面,偏向中小型規(guī)模的企業(yè)來說,開發(fā)和運(yùn)維很可能就是“同一撥人”。這個(gè)時(shí)候,系統(tǒng)配置要怎么做,就是個(gè)值得探討的問題了。
?------------------------------------------------------------------------------------------------------------
? ?Boss最初建議,修改Tomcat的啟動(dòng)腳本,在里面增加變量配置,比如“-Dlog4jOutputPath=c:/log4j”。
? ? 我一聽,就不太贊成這種做法了。對(duì)于開發(fā)與運(yùn)維都是一撥人,經(jīng)常需要和其它開發(fā)人員交流的情況,修改Tomcat自身的配置比較麻煩。
為什么這么說呢?
? ?Tomcat是系統(tǒng)級(jí)的程序,而我們的代碼是應(yīng)用級(jí)的程序。開發(fā)者,對(duì)自己的應(yīng)用程序,一般是掌控度非常高的,但是對(duì)于Tomcat等不是自己寫的系統(tǒng)程序,把控度比較低。Tomcat的隨便一行啟動(dòng)代碼,不小心改錯(cuò)了,就啟動(dòng)不了了。
? ?修改Tomcat還有壞處,本地開發(fā)、線上部署、交接給其它客戶,還得讓客戶去修改Tomcat這個(gè)和咱們的程序無關(guān)的配置,是不科學(xué)的。
? ?我的建議是,把這些配置,放在外圍,寫入個(gè)文件,比如startupTomcat.sh,在啟動(dòng)的時(shí)候指定參數(shù)。每個(gè)人都可以很靈活地修改log4j等配置參數(shù)。
? ?初步商議,我們采用這種做法。
?
? ?總結(jié)下:
<appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${log4jOutputPath}/front/default.log" /><!-- 設(shè)置日志輸出文件名 --> </appender>
啟動(dòng)的時(shí)候,增加VM參數(shù),-Dlog4jOutputPath=c:/log4j ----------------------------------------------------------------------------------------------------------
第2 種做法,適合開發(fā)和運(yùn)維都是同一人的情況,把log4j的變量,放在Web.xml里,部署的時(shí)候,需要手動(dòng)修改這個(gè)變量。
log4j配置
可在web.xml中配置log4j.xml的位置,參數(shù)名稱為:log4jXmlPath。
也可以,配置log4j的日志輸出位置的目錄,參數(shù)名稱為:log4jOutputPath。
<servlet><servlet-name>Log4jInit</servlet-name><servlet-class>cn.fansunion.common.web.Log4jInit</servlet-class> <init-param> <param-name>log4jXmlPath</param-name> <param-value>C:/log4j.xml</param-value> </init-param> <init-param> <param-name>log4jOutputPath</param-name> <param-value>C:/log4j/xiaolei2</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet>? ??注意:這2個(gè)參數(shù)都必須輸入絕對(duì)地址,如果log4jXmlPath沒有值,或者對(duì)應(yīng)的文件不存在,將把classpath下的log4j.xml作為默認(rèn)配置文件。如果再找不到,將報(bào)錯(cuò),log4j配置失敗。
如果log4jOutputPath沒有值,或者對(duì)應(yīng)的文件不存在,將把classpath下的log4j文件夾作為默認(rèn)的輸出目錄。
Author:Java代碼?Log4jInit.java
public class Log4jInit extends HttpServlet {private static final long serialVersionUID = 1L;public void init(ServletConfig config) throws ServletException {// 從web.xml中找到log4j的輸出目錄String log4jOutputPath = config.getInitParameter("log4jOutputPath");// 默認(rèn)的日志輸出位置if (StringUtils.isBlank(log4jOutputPath)) {log4jOutputPath = Log4jInit.class.getClassLoader().getResource("").getFile()+ "/log4j";}File log4jOutputPathFile = new File(log4jOutputPath);// 如果輸出文件不存在,手動(dòng)創(chuàng)建boolean log4xmlFileExists = log4jOutputPathFile.exists();if (!log4xmlFileExists) {System.out.println(log4jOutputPathFile.mkdirs());}// log4j.xml文件中的變量是在這里設(shè)置的System.setProperty("log4jOutputPath", log4jOutputPath);// 從web.xml中找到log4j.xml的輸出目錄String log4jXmlPath = config.getInitParameter("log4jXmlPath");boolean exist = false;// 如果在web.xml手動(dòng)配置,log4jXmlPath應(yīng)該使用絕對(duì)地址,否則,就使用默認(rèn)的位置和文件名就行if (StringUtils.isNotBlank(log4jXmlPath)) {File file = new File(log4jXmlPath);exist = file.exists();}// log4jXmlPath默認(rèn)位于classpath下log4j.xmlif (!exist) {URL resource = Log4jInit.class.getClassLoader().getResource("log4j.xml");if (resource != null) {log4jXmlPath = resource.getFile();}}DOMConfigurator.configure(log4jXmlPath);} }
----------------------------------------------------------------------------------------------------------
??從技術(shù)方面的學(xué)習(xí),加入一起好,遇到Boss,是我人生的大幸。要不然,我很難這么快就了解阿里等大公司的一些實(shí)際做法。
? 我決定扎根武漢,是不太可能去阿里系工作的。
??懷揣夢(mèng)想的我,也不可能委身于阿里。
? 小雷FansUnion-博學(xué)的互聯(lián)網(wǎng)技術(shù)工作者,全棧式多屏開發(fā)工程師
? 2015年1月25日
? 湖北-武漢-循禮門
轉(zhuǎn)載于:https://my.oschina.net/jiutianniao/blog/400279
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DrawTool画笔之图形笔
- 下一篇: 什么是委托以及案例