項目實戰之日誌的使用:Jboss環境下添加自定義日誌

日誌介紹

日誌已經成爲應用軟件中不可缺少的一部分,現在我沒發現哪個上線並且正常運營的項目沒有添加日誌;並且是否寫日誌已經成爲了檢測程序員是否專業的一個基本品德,就像寫註釋一樣,灰常重要!Apache的開源項目Log4j是一個功能強大的日誌組件,可以提供方便的日誌記錄。其他經常使用的還有slf4j、logback等日誌組件。無論那種日誌處理技術都能夠滿足當前的需求。

項目說明

現在參與的項目用的JBoss服務器,使用EJB實現的分佈式,並且拆分成了多個模塊,每個模塊在部署的時候會將dao層,service層,web層統一打成一個ear包部署。我們要做的 是各個模塊的日誌文件獨立輸出到一個文件中,並且每層生成一個log文件。


第一步:排除Jboss log4j

因爲jboss已經集成了log4j 的功能,我們可以直接使用JBoss的log4j,但是我們有自己的日誌輸出規則,而jBoss的規則最好不要修改,所以還是使用自己的log4j比較好。

我們需要修改自己模塊的ear裏的jboss-deployment-structure.xml文件。添加<exclusions>標籤的內容,意思是排除系統的jar包。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
        <deployment>
                <exclusions>
                        <module name="org.apache.log4j" />
                        <module name="org.apache.commons.logging" />
                        <module name="org.log4j" />
                        <module name="org.jboss.logging" />
                </exclusions>
        </deployment>

        <sub-deployment name="itoo-exam-scoreanalyze-core.jar">
                <exclusions>
                        <module name="org.apache.log4j" />
                        <module name="org.apache.commons.logging" />
                        <module name="org.log4j" />
                        <module name="org.jboss.logging" />
                </exclusions>
                <dependencies>
                        <module name="org.jboss.xnio" />
                        <module name="org.apache.shiro">
                                <imports>
                                        <include path="META-INF**" />
                                        <include path="org**" />
                                </imports>
                        </module>
                        <module name="org.jasig.cas.client">
                                <imports>
                                        <include path="META-INF**" />
                                        <include path="org**" />
                                </imports>
                        </module>
                        <module name="org.springframework.data">
                                <imports>
                                        <include path="META-INF**" />
                                        <include path="org**" />
                                </imports>
                        </module>
                </dependencies>
        </sub-deployment>

        <sub-deployment name="itoo-exam-scoreanalyze-web.war">
                <exclusions>
                        <module name="org.apache.log4j" />
                        <module name="org.apache.commons.logging" />
                        <module name="org.log4j" />
                        <module name="org.jboss.logging" />
                </exclusions>
                <dependencies>
                        <module name="org.jboss.xnio" />
                        <module name="org.apache.shiro">
                                <imports>
                                        <include path="META-INF**" />
                                        <include path="org**" />
                                </imports>
                        </module>
                        <module name="org.jasig.cas.client">
                                <imports>
                                        <include path="META-INF**" />
                                        <include path="org**" />
                                </imports>
                        </module>
                        <module name="org.springframework.data">
                                <imports>
                                        <include path="META-INF**" />
                                        <include path="org**" />
                                </imports>
                        </module>
                </dependencies>
        </sub-deployment>
</jboss-deployment-structure>


第二步:引入log4j 的jar包

下載log4j-1.2.9.jar文件放到 *:\jboss-eap-6.2\modules\org\springframework\spring\snowdrop 目錄下,並且在module.xml中添加log4j-1.2.9.jar的配置。

這裏寫圖片描述


第三步:添加log4j.xml配置文件

下面是以itoo-exam-scoreanalyze 模塊做的實例,在log4j.xml配置文件配置日誌生成規則:dao,service,controller每層擁有一個獨立的log文件,並且每天生成一個以日期爲名的log文件,定義好日誌輸出路徑。

下面是配置文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
        debug="false">
        <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
                </layout>
        </appender>

        <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
                <param name="File" value="D:/scoreanalyze-default.log" />
                <param name="DatePattern" value="'.'yyyy-MM-dd" />
                <param name="Append" value="false" />
                <param name="Encoding" value="UTF-8" />
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" value="%d [%X{usreId}] %-5p %c{2} - %m%n" />
                </layout>
        </appender>

        <appender name="ERROR-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
                <!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-error.log" /> -->
                <!-- 本地路徑 -->
                <param name="File" value="D:/scoreanalyze-error.log" />
                <param name="DatePattern" value="'.'yyyy-MM-dd" />
                <param name="Append" value="false" />
                <param name="Encoding" value="UTF-8" />
                <param name="threshold" value="error" />
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
                </layout>
        </appender>


        <appender name="SERVICE-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
                <!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-service.log" /> -->
                <!-- 本地路徑 -->
                <param name="File" value="D:/scoreanalyze-service.log" />
                <param name="DatePattern" value="'.'yyyy-MM-dd" />
                <param name="Append" value="false" />
                <param name="Encoding" value="UTF-8" />
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
                </layout>
        </appender>

        <appender name="DAO-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
                <!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-dao.log" /> -->
                <!-- 本地路徑 -->
                <param name="File" value="D:/scoreanalyze-dao.log" />
                <param name="DatePattern" value="'.'yyyy-MM-dd" />
                <param name="Append" value="false" />
                <param name="Encoding" value="UTF-8" />
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
                </layout>
        </appender>


        <appender name="CONTROLLER-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
                <!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-controller.log" /> -->
                <!-- 本地路徑 -->
                <param name="File" value="D:/scoreanalyze-controller.log" />
                <!-- 配置一天打一個日誌文傑 -->
                <param name="DatePattern" value="'.'yyyy-MM-dd" />
                <param name="Append" value="false" />
                <param name="Encoding" value="UTF-8" /> 
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
                </layout>
        </appender>



        <!-- service日誌,name寫該層的全限定名 -->
        <logger name="com.tgb.itoo.exam.scoreanalyze.service.impl" additivity="true">
                <level value="debug" />
                <appender-ref ref="SERVICE-APPENDER" />
        </logger>

        <!-- controller日誌 -->
        <logger name="com.tgb.itoo.exam.scoreanalyze.controller" additivity="true">
                <level value="debug" />
                <appender-ref ref="CONTROLLER-APPENDER" />
        </logger>


        <!-- dao日誌 -->
        <logger name="com.tgb.itoo.exam.scoreanalyze.eao.impl" additivity="true">
                <level value="debug" />
                <appender-ref ref="DAO-APPENDER" />
        </logger>

        <root>
                <level value="debug" />
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="DEFAULT-APPENDER" />
                <appender-ref ref="ERROR-APPENDER" />
        </root>
</log4j:configuration>


第四步:Web.xml中配置log4j

**在最上面添加即可**

<!--log4j的配置文件  -->
<context-param>
     <param-name>log4jConfigLocation</param-name> 
     <param-value>/WEB-INF/classes/config/log4j.xml</param-value> 
 </context-param> 
<!--啓動一個watchdog線程每1800秒掃描一下log4j配置文件的變化 -->
 <context-param> 
     <param-name>log4jRefreshInterval</param-name> 
     <param-value>1800000</param-value> 
 </context-param> 
<!--spring log4j監聽器 -->
 <listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
 </listener> 

然後就可以在代碼中輸出日誌了


第五步:Controller層代碼示例

定義logger 類:

Private Logger logger = 
(Logger) Logger.getLogger(XXXXXControllerImpl.class.getName());

在方法的關鍵點打印日誌信息:

    /**
     * 根據教師id查詢該教師監考過的考場信息
     * 
     * @param request
     * @param response
     */
    @RequestMapping("queryExamRoomInfo")
    public void queryExamRoomInfo(HttpServletRequest request,
            HttpServletResponse response)
    {
        //關鍵點1.方法名稱,(類名會自動加載上)
        StringBuilder str = new StringBuilder("queryExamRoomInfo-->");


        //關鍵點2. 入口參數信息
        // 獲取數據庫名稱
        String dataBaseName = "itoo_exam";
        // String dataBaseName = (String) request.getSession().getAttribute(CloudContext.DatabaseName);
        str.append("dataBaseName=").append(dataBaseName).append("_");

        // 獲取監考教師id
        String teacherId = "16f29zfmuY1nd875JJ2jUa";
        // String teacherId =(String)request.getSession().getAttribute();

        str.append("teacherId=").append(teacherId).append("_");

        JacksonJsonUntil jacksonJsonUtil = new JacksonJsonUntil();
        List<Map<Serializable, Serializable>> listMaps = new ArrayList<Map<Serializable, Serializable>>();
        try
        {
            // 根據監考教師id進行查詢考場安排信息
            listMaps = invigilateBean.queryExaminationRoomArrangementByTeacherId(teacherId,dataBaseName);

            //關鍵點3. 返回信息的判斷
            if(null == listMaps || listMaps.size() == 0){
                str.append("查詢考場安排信息:selectFromDb_listSize=0_");
            }else{
                str.append("查詢考場安排信息:selectFromDb_listSize=").append(listMaps.size()).append("_");
            }
        }
        catch (Exception e)
        {
            //關鍵點4. 異常信息,覺得應該用warn或者erro級別打印出來
            str.append("encounterError:").append(e.getMessage()).append("_");
            //logger.error("encounterError:"+ e.getMessage());
            //e.printStackTrace();
        }finally{
            //關鍵點5. 將整個日誌信息輸出
            logger.info(str.toString());
        }
        // 轉換成json
        jacksonJsonUtil.beanToJson(response, listMaps);
    }

日誌效果:

這裏寫圖片描述


小結

利用好工具會使我們事半功倍,但是前提一定要用好,否則將會帶來意想不到的後果,log4j也是,項目上線後一定要將日誌級別上調至info或warn,否則打印過多的信息會降低系統速度,並且還要注意定期清理日誌文件,降低磁盤佔用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章