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

原创 2016年05月31日 17:30:48

日志介绍

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

wildFly部署时sl4J模块冲突

问题日志 java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.log...
  • gbtyy
  • gbtyy
  • 2015年01月06日 15:04
  • 1914

更改JBOSS日志默认路径

JBOSS默认的日志存放在{jboss.server.log.dir}/server.log目录下如:D:\jboss-eap-4.3\jboss-as\server\slim\log\server....
  • lwei_998
  • lwei_998
  • 2011年07月15日 16:17
  • 8891

JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件

内容概述 JBoss7/WildFly设底层框架一大亮点的Module class loading,及每一个相对独立的模块看作一个Module,每个Module都有自己的class loader,Mo...
  • kylinsoong
  • kylinsoong
  • 2013年10月11日 22:22
  • 7265

jboss7 下 ear log4j 不能使用的问题

最近一直被jboss7 的log 苦恼了好久 普通的ejb 跟 war 包 都可以z
  • Ouvidia
  • Ouvidia
  • 2014年09月10日 20:41
  • 2730

Jboss-eap-6日志输出与案例分析

1.Jboss的日志系统(standalone模式) 在介绍案例分析之前先来介绍一下Jboss提供的日志系统,下载EAP的zip包解压后的结构如下: 在standalone目录下有两个文件st...
  • liupin_2011
  • liupin_2011
  • 2015年01月04日 11:46
  • 1753

JBoss6.1.0修改启动jvm内存以及修改日志级别

修改内存: %JBOSS_HOME%/bin/standalone.conf下
  • liangbinny
  • liangbinny
  • 2014年11月18日 09:53
  • 2371

log4j----按时间和大小增加新日志文件/输出多个自定义日志文件

log4j 按时间和大小增加新日志文件         我们开发的B/S结构系统,在服务端一般要有日常运行的日志记录。保存成日志文件形式的时候,大家经常会遇到一个问题:日志文件过大。上百兆的...
  • fww445231202
  • fww445231202
  • 2016年09月20日 13:41
  • 2794

springMVC项目在jboss7中配置应用自己的log4j

Jboss7默认采用容器自己的log4j module,应用自己配置的log4j不起作用,需要应用做一些设置: 以springMVC项目为例: 1> 在WEB-INF下新建文件jboss-depl...
  • sundongsdu
  • sundongsdu
  • 2013年07月17日 11:19
  • 3192

JBoss中配置web应用的日志

jboss下通过配置log4j.xml实现web应用的日志 作者Blog:http://blog.csdn.net/elathen/log4j是一个优秀的开源的java日志系统,jboss内部也集成了...
  • caihaijiang
  • caihaijiang
  • 2010年09月24日 12:17
  • 1643

JBoss下载与JBoss安装

JBoss下载与JBoss安装 一.              下载与安装JBoss 在本文中,我们下载的JBoss版本为:4.2.1.GA。 下载地址: http:/...
  • rushkid02
  • rushkid02
  • 2012年09月18日 19:46
  • 30290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:项目实战之日志的使用:Jboss环境下添加自定义日志
举报原因:
原因补充:

(最多只允许输入30个字)