项目实战之日志的使用:Jboss环境下添加自定义日志

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010028869/article/details/51547627

日志介绍

日志已经成为应用软件中不可缺少的一部分,现在我没发现哪个上线并且正常运营的项目没有添加日志;并且是否写日志已经成为了检测程序员是否专业的一个基本品德,就像写注释一样,灰常重要!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,否则打印过多的信息会降低系统速度,并且还要注意定期清理日志文件,降低磁盘占用。

猜你喜欢

转载自blog.csdn.net/u010028869/article/details/51547627