项目实战之日志的使用: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,否则打印过多的信息会降低系统速度,并且还要注意定期清理日志文件,降低磁盘占用。

deploy/jbossweb-tomcat55.sar/server.xml <Valve className="org.apache.catalina.valves.FastCommonAccessLogValve" prefix="access_log." suffix=".log" pattern="%h %t %r %s %D" directory="${jboss.server.home.dir}/../output/logs" resolveHosts="false" /> http://tomcat.apache.org/tomcat-5.5-doc/config/valve.html pattern配置: %a - Remote IP address %A - Local IP address %b - Bytes sent, excluding HTTP headers, or '-' if zero %B - Bytes sent, excluding HTTP headers %h - Remote host name (or IP address if resolveHosts is false) %H - Request protocol %l - Remote logical username from identd (always returns '-') %m - Request method (GET, POST, etc.) %p - Local port on which this request was received %q - Query string (prepended with a '?' if it exists) %r - First line of the request (method and request URI) %s - HTTP status code of the response %S - User session ID %t - Date and time, in Common Log Format %u - Remote user that was authenticated (if any), else '-' %U - Requested URL path %v - Local server name %D - Time taken to process the request, in millis %T - Time taken to process the request, in seconds %I - current request thread name (can compare later with stacktraces) There is also support to write information from the cookie, incoming header, outgoing response headers, the Session or something else in the ServletRequest. It is modeled after the apache syntax: %{xxx}i for incoming request headers %{xxx}o for outgoing response headers %{xxx}c for a specific request cookie %{xxx}r xxx is an attribute in the ServletRequest %{xxx}s xxx is an attribute in the HttpSession The shorthand pattern name common (which is also the default) corresponds to '%h %l %u %t "%r" %s %b'.
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值