构建SSH框架日志系统

来源:互联网 发布:ss24二极管数据手册 编辑:程序博客网 时间:2024/05/19 19:40

完善的Web应用需要有完善的日志系统的支持,日志系统在项目的跟踪调试过程中发挥着重要作用。Struts,Spring和Hibernate均提供了自己的日志框架,有效地配置日志系统在项目开发过程中占据着一定的比重。本文简要介绍SSH框架的日志系统和相关配置,以方便日常项目的开发。

  • Struts 2的日志系统

Struts使用commons logging来封装其日志系统,JCL(Apache Commons Logging)使用两个基本的抽象概念:Log(基本的logger)和LogFactory(用于创建Log实例)。指定一个特定的Log实现是很有用处的,默认的LogFactory实现使用如下发现机制来决定它应该使用哪种类型的Log实现:

  1. 寻找该工厂的一个名为org.apache.commons.logging.Log的配置属性,该配置属性可由java代码显式设置,但通常是通过在classpath中放置一个名为commons-logging.properties的文件来设置;
  2. 寻找一个名为org.apache.commons.logging.Log的系统属性;
  3. 如果在应用的classpath中log4j日志系统可用,则使用相应的包装类(Log4JLogger);
  4. 如果应用运行在JDK 1.4系统上,则使用相应的包装类(Jdk14Logger);
  5. 使用默认的简单日志包装器(SimpleLog)。

在Web应用中通常使用Log4j来实现Struts的日志系统,由上述内容可知,Struts提供了Log4j的自动发现功能。

  • Spring 2的日志系统

Spring使用Log4j作为其日志系统。在Web环境中,可以使用Log4jWebConfigurer来实现定制的Log4j初始化,它允许指定Web应用中的日志文件的路径,并提供实现自动刷新检查的选择项。

 

在servlet context层次支持三个初始化参数,在web.xml中通过context-param来配置:

  1. log4jConfigLocation:指定Log4j配置文件的位置。可以是一个“classpath:”位置(例如:“classpath:log4j.properties”);或者是一个文件的绝对URL(例如:“file:c:/log4j.properties”);或者是相对于应用根目录的相对路径(例如:”/WEB-INF/log4j.properties“)。如果没有指定,将应用默认的Log4j初始化(位于classpath中的”log4j.properties“或者”log4j.xml“)
  2. log4jRefreshInterval和log4jExposeWebAppRoot:具体内容参见Spring Java Doc。

为定制Log4j初始化,需要在web.xml中注册相应的监听器,如下


   

[xhtml] view plaincopy
  1. <!--  
  2.    - Configures Log4J for this web app.  
  3.    - As this context specifies a context-param" log4jConfigLocation", its file path  
  4.    - is used to load the Log4J configuration, including periodic refresh checks.  
  5.    -  
  6.    - Would fall back to default Log4J initialization (non-refreshing) if no special  
  7.    - context-params are given.  
  8.    -  
  9.    - Exports a "web app root key", i.e. a system property that specifies the root  
  10.    - directory of this web app, for usage in log file paths.  
  11.  -->  
  12.      
  13. <listener>  
  14.    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  15. </listener>  
 

 

在web.xml文件中,还可以设置webAppRootKey参数,来导出可以在log4j.properties配置文件中使用的代表Web应用根目录的占位符。配置如下:

 

[xhtml] view plaincopy
  1. <context-param>  
  2.   <param-name>webAppRootKey</param-name>  
  3.   <param-value>sshintegration.root</param-value>  
  4. </context-param>  

 

如果希望使用webAppRootKey,则需要注册Log4jConfigListener监听器,另外,该监听器需要在ContextLoaderListener之前注册。对于Servlet 2.3或者之前的版本,需要使用Log4jConfigServlet,并且其load-on-startup的值应低于ContextLoaderServlet。

  • Hibernate 3的日志系统

Hibernate使用Simple Logging Facade for Java (SLF4J)来记录各种系统事件。SLF4J能够将你的日志输出定向到多种日志框架(NOP,Simple,Log4j version 1.2,JDK 1.4 logging,JCL,或者logback),最终选择何种框架来实现你的日志系统依赖于你选择的绑定。为了建立日志,你需要将slf4j-api放置在你的classpath中,另外还需要一同放置你所选定的绑定,比如slf4j-log4j12.jar,如果你选定log4j作为你最终的日志系统实现。

 

为使用log4j,你需要放置log4j.properties在你应用的classpath中。

 

注:对于Hibernate 3.3.2 GA版本发布的包中,提供slf4j-api-1.5.8.jarJAR包,但是却没有提供相应绑定的JAR包,相应绑定的JAR包可以到SLF4J的官方网站(www.slf4j.org)获取,如果使用Log4j作为日志系统的实现,需要将slf4j-log4j12-1.5.8.jar包与上述jar包一同放置在/WEB-INF/lib下。

 

如果在配置过程中,出现如下类似的异常,则可能的原因就是缺少slf4j与具体的日志实现绑定的JAR包:


[xhtml] view plaincopy
  1. ...  
  2. Caused by: java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder  
  3.     at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:223)  
  4.     at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120)  
  5.     at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)  
  6.     at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269)  
  7.     at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)  
  8.     at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:255)  
  9. ...  

 

可见,Struts,Spring和Hibernate均支持Log4j作为其日志实现系统,因此如果能够合理地配置Log4j,便可以为SSH架构建立起完善的日志系统。一个典型的Log4j配置具有如下形式:

 

[xhtml] view plaincopy
  1. # For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!  
  2. # For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.  
  3. log4j.rootLogger=INFO, stdout, logfile  
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  5. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  6. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
  7. log4j.appender.logfile=org.apache.log4j.RollingFileAppender  
  8. log4j.appender.logfile.File=${sshintegration.root}/WEB-INF/SSHIntegration.log  
  9. log4j.appender.logfile.MaxFileSize=512KB  
  10. # Keep three backup files.  
  11. log4j.appender.logfile.MaxBackupIndex=3  
  12. # Pattern to output: date priority [category] - message  
  13. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
  14. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  
  15. ...  

 

其中,${sshintegration.root}便是上述在web.xml文件中通过context-param来指定的参数。

 

至此,SSH架构所需的日志系统基本完成,log4j.properties中的配置项需要根据具体的应用需求而发生变化,具体的配置可以参看Log4j的官方网站(http://logging.apache.org/)和SSH相关开发文档。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买的二手房土地证没过户怎么办 b2扣了9分怎么办 上海网约车车证怎么办 b2驾照累计12分怎么办 c1本扣满12分怎么办 太原公共自行车丢了怎么办 在太原出租车丢了东西怎么办 太原社保卡丢了怎么办 太原铁路医保卡丢了怎么办 学车体检视力不合格怎么办 换驾照色弱被拒怎么办 在上海考驾照贵怎么办 驾驶证有效期过了半年怎么办 资格证脱审2年了怎么办 换驾驶证时眼睛近视了怎么办 违章累计扣12分怎么办 一个违章扣12分怎么办 a1驾照扣3分怎么办 a1驾照扣12分怎么办 吃了毓婷哺乳了怎么办 吃了毓婷后出血怎么办 吃金毓婷喝了水怎么办 白带浓稠浆糊样怎么办 驾校学费不给退怎么办 b1驾证扣了9分怎么办 机动车登记证丢了怎么办 b1驾照扣了9分怎么办 听力正常体检不过关怎么办 做完人流第二天同房了怎么办 医院的票据丢了怎么办 体检人体成分(脂肪缺乏)该怎么办 诊断出右下叶肺炎怎么办 做胸透穿钢圈内衣怎么办 预约不上留学体检怎么办 跨省离职后社保怎么办 开车到成都限号怎么办 月经量多怎么办吃什么 报驾校体检视力不达标怎么办 换驾驶证c1一只眼不合格怎么办 考驾照紧张腿抖怎么办 驾照该换了色弱怎么办