實例介紹,如何在開發中將各層日志歸類輸出.


最近開發的模塊中,日志文件的輸出很郁悶,基於xml配置的,先不說好壞,至少個人很不適應那種配置方式,所以今天談一下日志分層控制輸出.

在開發中,大多都基於一定的框架模式,框架模式降低了模塊間的耦合性、提高了代碼的重用性、部署快、成本低,而且代碼的維護性高例如Java中常用的mvc框架模式.

實例中結合mvc框架模式談談如何將程序中各個層的日志歸類輸出.

步驟一創建spring項目,web.xml文件中添加日志文件的配置監聽

    <!-- 日志文件 -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/context/log4j.properties</param-value>
    </context-param>
    
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>3000</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>


第二步
日志的屬性文件配置

#log4j.rootLogger=INFO,console,file
log4j.rootLogger=INFO,console,file
#用logger時給它一個自定義的名字(如這里的"ctrlLog"),程序中public final static Logger job=Logger.getLogger("ctrlLog");
#然后在log4j.properties中做出相應配置即可,example:log4j.appender.ctrl=org.apache.log4j.DailyRollingFileAppender 
log4j.logger.ctrlLog=INFO,ctrl
log4j.logger.serviceLog=INFO,service
log4j.logger.daoLog=INFO,dao
log4j.logger.indexLog=INFO,index
log4j.logger.jobLog=INFO,job
log4j.logger.searchLog=INFO,search

#定義console輸出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#定義console控制台的布局模式為PaternLayout
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#定義console控制台的輸出格式
log4j.appender.console.layout.ConversionPattern=%p %d{HH:mm:ss.SSS} [%X{ip}] - %l %m%n


#定義file輸出到文件
log4j.appender.file=org.apache.log4j.RollingFileAppender
#定義file輸出到哪個文件
log4j.appender.file.File=/var/log/vms/vms.log
#定義file輸出文件的最大長度
log4j.appender.file.MaxFileSize = 1024KB
#定義file的備份文件數
log4j.appender.file.MaxBackupIndex = 3
#定義file的布局模式為PatternLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#定義file的輸出模式
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

#mybatis操作日志配置  
log4j.logger.com.ibatis=ERROR
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=ERROR
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=ERROR
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=ERROR
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=ERROR
log4j.logger.com.ibatis.common.util.StopWatch=ERROR
log4j.logger.java.sql.Connection=ERROR
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

#將控制層的日志打印到controller.log文件中
log4j.appender.ctrl=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.ctrl.File=/var/log/vms/controller.log 
log4j.appender.ctrl.layout=org.apache.log4j.PatternLayout
log4j.appender.ctrl.DatePattern='_'yyyy-MM-dd
log4j.appender.ctrl.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]:%X{ip} [%-5p] %m%n


#將業務層的日志打印到service.log文件中
log4j.appender.service=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.service.File=/var/log/vms/service.log 
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.DatePattern='_'yyyy-MM-dd
log4j.appender.service.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]:%X{ip} [%-5p] %m%n


#將持久層的日志打印到dao.log文件中
log4j.appender.dao=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.dao.File=/var/log/vms/dao.log 
log4j.appender.dao.layout=org.apache.log4j.PatternLayout
log4j.appender.dao.DatePattern='_'yyyy-MM-dd
log4j.appender.dao.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]:%X{ip} [%-5p] %m%n

#將定時作業的日志打印到job.log文件中
log4j.appender.job=org.apache.log4j.DailyRollingFileAppender
log4j.appender.job.File=/var/log/vms/job.log 
log4j.appender.job.layout=org.apache.log4j.PatternLayout
log4j.appender.job.DatePattern='_'yyyy-MM-dd
log4j.appender.job.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}] [%-5p] %m%n


#將索引的日志打印到index.log文件中
log4j.appender.index=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.index.File=/var/log/vms/index.log 
log4j.appender.index.layout=org.apache.log4j.PatternLayout
log4j.appender.index.DatePattern='_'yyyy-MM-dd
log4j.appender.index.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]:%X{ip} [%-5p] %m%n

#將搜索操作日志打印到search.log文件中
log4j.appender.search=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.search.File=/var/log/vms/search.log 
log4j.appender.search.layout=org.apache.log4j.PatternLayout
log4j.appender.search.DatePattern='_'yyyy-MM-dd
log4j.appender.search.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]\:%X{ip} [%-5p] %m%n

日志文件根據需要配置其輸出級別,實例中配置的為INFO級別,正式環境下可配置為ERROR級別,因為大量的INFO日志記錄會耗費不必要的磁盤空間.

關於日志文件的配置,可以參看這篇http://www.cnblogs.com/dennisit/archive/2013/01/01/2841603.html

第三步程序中分離各層輸出控制

package com.bae.vms.util; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; /** * description: * * @author <a href='mailto:dennisit@163.com'> Cn.pudp (En.dennisit)</a> Copy Right since 2013-12-20 * * com.bae.vms.util.LogUtil.java * */

public class LogUtil { /** * 一般日志log */
    public final static Logger log=Logger.getLogger(LogUtil.class); public static void logDebug(String s){ log.debug(s); } public static void logInfo(String s){ log.info(s); } public static void logError(String s){ log.error(s); } public static void logError(String s,Exception e){ log.error(s,e); } /** * 索引日志 */
    public final static Logger indexLog=Logger.getLogger("indexLog"); public static void indexLogDebug(String s){ indexLog.debug(s); } public static void indexLogInfo(String s){ indexLog.info(s); } public static void indexLogError(String s){ indexLog.error(s); } public static void indexLogError(String s,Exception e){ indexLog.error(s,e); } /** * controller日志 */
    public final static Logger ctrl=Logger.getLogger("ctrlLog"); public static void ctrlLogDebug(String s){ ctrl.debug(s); } public static void ctrlLogInfo(String s){ ctrl.info(s); } public static void ctrlLogError(String s){ ctrl.error(s); } public static void ctrlLogError(String s,Exception e){ ctrl.error(s,e); } /** * 業務邏輯層日志 */
    public final static Logger service=Logger.getLogger("serviceLog"); public static void serviceLogDebug(String s){ service.debug(s); } public static void serviceLogInfo(String s){ service.info(s); } public static void serviceLogError(String s){ service.error(s); } public static void serviceLogError(String s,Exception e){ service.error(s,e); } /** * 數據操作層日志 */
    public final static Logger dao=Logger.getLogger("daoLog"); public static void daoLogDebug(String s){ dao.debug(s); } public static void daoLogInfo(String s){ dao.info(s); } public static void daoLogError(String s){ dao.error(s); } public static void daoLogError(String s,Exception e){ dao.error(s,e); } /** * 數據操作層日志 */
    public final static Logger job=Logger.getLogger("jobLog"); public static void jobLogDebug(String s){ job.debug(s); } public static void jobLogInfo(String s){ job.info(s); } public static void jobLogError(String s){ job.error(s); } public static void jobLogError(String s,Exception e){ job.error(s,e); } /** * 搜索操作層日志 */
    public final static Logger search=Logger.getLogger("searchLog"); public static void searchLogDebug(String s){ search.debug(s); } public static void searchLogInfo(String s){ search.info(s); } public static void searchLogError(String s){ search.error(s); } public static void searchLogError(String s,Exception e){ search.error(s,e); } /** * * @param logger * @param s * @param e */
    public static void error(Logger logger,String s,Exception e){ logger.error(s,e); } /** * 獲取異常的堆棧信息 * * @param t * @return 
     */  
    public static void getStackTrace(Throwable t){ StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); try{ t.printStackTrace(pw); log.error(sw.toString()); }finally{ pw.close(); } } }


第四步
:各層控制輸出

dao層日志捕獲

 @Override public Page<AdvPosition> find(Integer pageNum, Integer pageSize, String where, Object[] queryParams, Map<String, String> orderBy)throws ServiceException { try { LogUtil.dao.info("AdvPositionDao.find(...) finished."); return this.advPositionDao.find(pageNum, pageSize, where, queryParams, orderBy); } catch (DaoException e) { LogUtil.dao.error("AdvPositionDao.find(...)" + e.getMessage(),e); e.printStackTrace(); } return null; }

業務層日志捕獲

    /** * 分頁展示廣告位置列表 * * @author <a href='mailto:dennisit@163.com'>Cn.Pudp(En.dennisit)</a> Copy Right since 2014-1-30 下午01:07:40 * * @param request * @param response * @param pageNum * @return
     */ @RequestMapping(value={"/advinfoes.html","/advinfoes"},method={RequestMethod.GET,RequestMethod.POST}) public ModelAndView advInfoList(HttpServletRequest request, HttpServletResponse response){ Map<String,Object> map = new HashMap<String,Object>(); Map<String,String> orderBy = new HashMap<String, String>(); orderBy.put("id", "desc");                //按照id降序排列
        try { //查找所有的廣告位置列表,查詢10條,按照Id降序排列
            Page<AdvInfo> page = this.advInfoService.find(1, BaseMultiController.DEFAULT_PAGE_SIZE, orderBy); map.put("page", page); LogUtil.ctrl.info("AdvInfoService.find(..) info:" + page); } catch (ServiceException e) { LogUtil.service.error("AdvInfoService.find(..) error:" + e.getMessage()); e.printStackTrace(); } return toView("vms/adv_info_list", map); }

這樣就可以將各層日志輸出到各層對應的日志文件記錄中了.輸出位置可以通過properties文件配置.

轉載請注明出處:[http://www.cnblogs.com/dennisit/p/3619549.html]

在線交談


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM