zoukankan      html  css  js  c++  java
  • 实例介绍,如何在开发中将各层日志归类输出.

    最近开发的模块中,日志文件的输出很郁闷,基于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]

    在线交谈

  • 相关阅读:
    hdu2083
    斐波那数
    hdu2000~hdu2099
    hdu2070
    hdu2071
    hdu2095
    TSINGSEE青犀视频云边端架构视频直播点播平台/人脸识别系统EasyDSS 如何开启debug 日志?
    RTMP协议视频直播点播智能分析平台EasyDSS如何增加Stream模块实现TCP代理?
    RTMP推流平台/视频直播点播分析平台/人脸识别系统EasyDSS如何实现RTMP负载均衡?
    关于视频智能分析平台人脸识别/车牌识别系统EasyDSS登录及直播点播的安全防盗链验证说明
  • 原文地址:https://www.cnblogs.com/dennisit/p/3619549.html
Copyright © 2011-2022 走看看