1. 程式人生 > >專案實戰之日誌的使用:Jboss環境下新增自定義日誌

專案實戰之日誌的使用: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,否則列印過多的資訊會降低系統速度,並且還要注意定期清理日誌檔案,降低磁碟佔用。