案例分析2 --- Design for Log module

今天我们来说说系统框架基础件-日志模块的设计.

什么是框架? 框架简而言之就是针对某类应用程序而言,能否重复使用的,独立的,必要的一些资源.

不需要你重新设计,构建新的应用程序只需要对这些资源进行少许配置,就可以开始针对业务逻辑的

开发.框架的使用使程序员更加注重业务逻辑的实现,优化.一般框架而言都又自己的最最最核心的

包,就是通常所说的核心包,是整个框架运行起来的基础.这里我用基础件来代替.

而日志模块是一个应用程式的核心,特别是java web application这类程序,这个就是核心的核心.

应该作为application framework foundation 使用.在程序开始执行程序逻辑和业务逻辑前,就必须加载.

日志模块的设计目标应该有如下几点:

1.客户能够自行配置日志产生的文件路径和日志文件名称.

2.在开发阶段应该提供最详细的日志信息.在产品阶段日志系统至记录错误或者严重错误的信息.

做到日志信息最小话.

3.提供控制台观察日志信息的处理.类似于System.out.println()的标准输出流信息.

4.日志配置文件支持热部署,用户或者开发人员只需要改变配置就可以重新控制日志的输出和

日志文件的存放路进和文件.

基于以上四点目标.我们选用公认的日志输出最快,系统资源占用最小的open source组件log4j

集成到我们的系统框架当中.实现方式可以按照如下动作来进行.

1.框架初始化时,加载Log4j日志组件.

2.推荐使用xml配置方式来设置日志信息,并提供可修改的日志文件存放路径和文件名称的

接口,用户和开发人员一旦设置好路进和名称之后,想要修改日志文件设置信息,就只需要到

指定的文件进行修改,而不用修改程序,或者重新打包发布应用,做到一劳永逸.

3.使用log4j的xmlwatchdog加载这个日志配置文件xml,这样log4j就支持热部署了

4.框架中你应该提供本框架的日志接口供客户端程序员调用,因此你可以通过简单工厂模式

来实现这个日志模块.

5.框架初始化后,程序员就可以使用你自己框架的日志组件接口了.

如:

protected Logger log = LoggerFactory.getLogger(this);

这个一个受保护的类字段你可以放在基类当中,那么本类和子类都可以这样调用.

log.debug(" No Sys_type_id .");

log.info(No Sys_type_id .");

log.warn(" No Sys_type_id .");

log.error(" No Sys_type_id .");

log.fatal(" No Sys_type_id .");

这是是依据log4j的级别

 Level.ALL
 Level.DEBUG
 Level.INFO
 Level.WARN
 Level.ERROR
 Level.FATAL
 Level.OFF

我们从严重程度从低到高依次提供的不同级别的日志记录方法

根据日志配置文件中的不同设置,我们就可以针对日志输出做到不同的控制.

同时可以在配置文件中控制到哪些包路径下的日志文件可以输出,使用什么级别的输出.

等等,具体控制请查看Log4j组件的相关文档.

其次需要重点强调的一点是,系统开发的时候坚决杜绝使用System.out.println的日志记录动作.

这是一个极其不负责的日志记录方式.不但加大系统的开销,而且在服务器以后台服务程序启动的

时候,根本无法看到日志信息,因为根本就没有控制台显示.

另,附一份简单的配置文件.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<!--
 Level.ALL
 Level.DEBUG
 Level.INFO
 Level.WARN
 Level.ERROR
 Level.FATAL
 Level.OFF
-->

  <!-- ================================================================= -->
  <!--                       a console appender                          -->
  <!--     debug can be turned off by setting level of root to "off"     -->
  <!-- ================================================================= -->
 <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
   <!--<param name="ConversionPattern" value="%r %-5p [%t] (%F:%L) - %m%n"/>-->
   <param name="ConversionPattern" value="%-5p %c %x - %m%n"/>
  </layout>
 </appender>

  <!-- ================================================================= -->
  <!--                     a rolling file appender                       -->
  <!-- ================================================================= -->
 <appender name="FRAMEWORK" class="org.apache.log4j.DailyRollingFileAppender">
  <param name="File" value="c://ADF_FRAMEWORK.log" />
  <param name="Append" value="true" />
  <layout class="org.apache.log4j.PatternLayout">
   <!--<param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %c %x - %m%n"/>-->
   <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %c %x - %m%n"/>
  </layout>
 </appender>

 <appender name="BUGTRACKER" class="org.apache.log4j.DailyRollingFileAppender">
  <param name="File" value="c://BT.log" />
  <param name="Append" value="true" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %c %x - %m%n"/>
  </layout>
 </appender>

 <appender name="TEST_UNIT" class="org.apache.log4j.DailyRollingFileAppender">
  <param name="File" value="c://ADF_TEST.log" />
  <param name="Append" value="true" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %c %x - %m%n"/>
  </layout>
 </appender>

 <appender name="OTHER_LOG" class="org.apache.log4j.DailyRollingFileAppender">
  <param name="File" value="c://ADF_OTHER.log" />
  <param name="Append" value="true" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %c %x - %m%n"/>
  </layout>
 </appender>

 <!-- ==================================ASYNC=============================================== -->
 <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
       <appender-ref ref="FRAMEWORK"/>
          <appender-ref ref="TEST_UNIT"/>
          <appender-ref ref="OTHER_LOG"/>
          <appender-ref ref="BUGTRACKER"/>
 </appender>

 <!-- ==================================category=============================================== -->
 <category name="com.cnjsp.bugtracker" additivity="false">
  <priority value="DEBUG"/>
     <appender-ref ref="BUGTRACKER"/>
  <appender-ref ref="CONSOLE"/>
 </category>


 <category name="com.mdwolf" additivity="false">
  <priority value="DEBUG"/>
     <appender-ref ref="FRAMEWORK"/>
  <appender-ref ref="CONSOLE"/>
 </category>


 <!--test-->
 <category name="test" additivity="false">
  <priority value="DEBUG"/>
     <appender-ref ref="TEST_UNIT"/>
  <appender-ref ref="CONSOLE"/>
 </category>


 <!--oracle-->
 <category name="oracle" additivity="false">
  <priority value="ERROR"/>
     <appender-ref ref="OTHER_LOG"/>
  <appender-ref ref="CONSOLE"/>
 </category>


 <!--org-->
 <category name="org" additivity="false">
  <priority value="ERROR"/>
     <appender-ref ref="OTHER_LOG"/>
  <appender-ref ref="CONSOLE"/>
 </category>


 <!--jsp error-->
 <category name="TimeOut.jsp" additivity="false">
  <priority value="ERROR"/>
     <appender-ref ref="OTHER_LOG"/>
  <appender-ref ref="CONSOLE"/>
 </category>


 <!--mysql-->
 <category name="mysql" additivity="false">
  <priority value="ERROR"/>
     <appender-ref ref="OTHER_LOG"/>
  <appender-ref ref="CONSOLE"/>
 </category>

 <!-- ================================================================= -->
 <!--                       a  file root                                -->
 <!-- ================================================================= -->
 <root>
        <priority value="DEBUG"/>
  <appender-ref ref="CONSOLE"/>
  <appender-ref ref="BUGTRACKER"/>
  <appender-ref ref="FRAMEWORK"/>
 </root>

</log4j:configuration>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值