日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

实例介绍,如何在开发中将各层日志归类输出.

發(fā)布時(shí)間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实例介绍,如何在开发中将各层日志归类输出. 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近開(kāi)發(fā)的模塊中,日志文件的輸出很郁悶,基于xml配置的,先不說(shuō)好壞,至少個(gè)人很不適應(yīng)那種配置方式,所以今天談一下日志分層控制輸出.

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

實(shí)例中結(jié)合mvc框架模式,?談?wù)勅绾螌⒊绦蛑懈鱾€(gè)層的日志歸類輸出.

步驟一:?創(chuàng)建spring項(xiàng)目,web.xml文件中添加日志文件的配置監(jiān)聽(tīng)

<!-- 日志文件 --><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時(shí)給它一個(gè)自定義的名字(如這里的"ctrlLog"),程序中public final static Logger job=Logger.getLogger("ctrlLog"); #然后在log4j.properties中做出相應(yīng)配置即可,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輸出到控制臺(tái) log4j.appender.console=org.apache.log4j.ConsoleAppender #定義console控制臺(tái)的布局模式為PaternLayout log4j.appender.console.layout=org.apache.log4j.PatternLayout #定義console控制臺(tái)的輸出格式 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輸出到哪個(gè)文件 log4j.appender.file.File=/var/log/vms/vms.log #定義file輸出文件的最大長(zhǎng)度 log4j.appender.file.MaxFileSize = 1024KB #定義file的備份文件數(shù) 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#將業(yè)務(wù)層的日志打印到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#將定時(shí)作業(yè)的日志打印到j(luò)ob.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

日志文件根據(jù)需要配置其輸出級(jí)別,實(shí)例中配置的為INFO級(jí)別,正式環(huán)境下可配置為ERROR級(jí)別,因?yàn)榇罅康?/span>INFO日志記錄會(huì)耗費(fèi)不必要的磁盤空間.

關(guān)于日志文件的配置,可以參看這篇:?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);} /*** 業(yè)務(wù)邏輯層日志*/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);} /*** 數(shù)據(jù)操作層日志*/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);} /*** 數(shù)據(jù)操作層日志*/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層日志捕獲

@Overridepublic 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;}

業(yè)務(wù)層日志捕獲

/*** 分頁(yè)展示廣告位置列表** @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);}

這樣就可以將各層日志輸出到各層對(duì)應(yīng)的日志文件記錄中了.輸出位置可以通過(guò)properties文件配置.

轉(zhuǎn)載請(qǐng)注明出處:[http://www.cnblogs.com/dennisit/p/3619549.html]

總結(jié)

以上是生活随笔為你收集整理的实例介绍,如何在开发中将各层日志归类输出.的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。