今天我们来说说系统框架基础件-日志模块的设计.
什么是框架? 框架简而言之就是针对某类应用程序而言,能否重复使用的,独立的,必要的一些资源.
不需要你重新设计,构建新的应用程序只需要对这些资源进行少许配置,就可以开始针对业务逻辑的
开发.框架的使用使程序员更加注重业务逻辑的实现,优化.一般框架而言都又自己的最最最核心的
包,就是通常所说的核心包,是整个框架运行起来的基础.这里我用基础件来代替.
而日志模块是一个应用程式的核心,特别是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>