Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330663
  • 博文数量: 76
  • 博客积分: 8291
  • 博客等级: 中将
  • 技术积分: 1540
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-22 10:13
文章分类

全部博文(76)

文章存档

2009年(1)

2008年(75)

我的朋友

分类: Java

2008-03-03 15:33:06

log4j是一个很好的开源的日志项目,下面就我在实际中使用的一些情况作一个小结(我所写的是以spring为框架的运用,之所以要提到这点,是因为在spring中专门有处理log4j的地方,而我也用到了这些地方)。

  在使用的第一步你要明白你所发布的web项目所使用的服务器,因为不同的服务器对于使用log4j是有些不同的,我在实际使用中主要是用tomcat和 jboss两类,对于tomcat,它本身是没有配置log4j的,所以使用起来和常规的一样;而在jboss中它是本身配置了log4j的,所以有时候 我们在看项目代码时,其整个项目并没有log4j的配置文件,而在一些类中仍然定义了Logger,例如static Logger log = org.apache.log4j.Logger.getLogger(UserDaoImple.class);,这就表明开发者打算使用jboss默 认的log4j的配置,我们可以在jboss下的对应的log目录下的server.log中看到日志,jboss本身的log4j的配置是将 debug,info级的日志写在server.log中,而像error等级别比较高的日志打印到控制台上,而写到server.log中的日志比较 多,并不方便查看。于是我们想到使用自己的log4j配置写到某个具体的文件中(注意文件要先建立,才能忘里面写东西,log4j自己不能建立文件),但 这里因为jboss有它自己的log4j配置,所以如果我们配置的log4j包含Console的Appender时,就会出错,错误类似于

ERROR: invalid console appender config detected, console stream is looping.
解决方法一是不用Console的Appender,或者改jboss的配置文件,在jboss-service.xml文件里,把

        resource:log4j.xml
        false
        true

我 建议不用Console的Appender,当然这是对jboss3.2.x是这样,对于jboss4.0.x如果我们要用自己的log4j配置照上述改 还是会有问题,会有类似于log4j:ERROR A "org.jboss.logging.util.OnlyOnceErrorHandler" object is not assignable to a "org.apache.log4j.spi.ErrorHandler" variable的异常,解决方法是把/server/default/deploy/jbossweb-tomcat55.sar/META- INF/jboss-service.xml 中的以下两个熟悉改成true
true
true

以上就是使用jboss服务器可能出现的问题,解决了这些再来使用log4j就比较简单了。

下面说说对于采用了spring框架的项目如何使用log4j,在spring中使用log4j,有些方便的地方,

1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下。
2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。
3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。

首先我们在web.xml中需要设定一下


log4jConfigLocation
WEB-INF/log4j.properties


log4jRefreshInterval
60000


org.springframework.web.util.Log4jConfigListener

其 中第二部分就是能够动态修改log4j.properties的关键,容器会每60秒扫描log4j的配置文件 。对于log4j的配置文件如何写,这就不多说了,大家可以去google,有一点就是我们如果用RollingFileAppender或者 FileAppender时,可以通过${webapp.root}来定位到服务器的发布的该项目下,这是spring把web目录的路径压入到了 webapp.root的系统变量。然后,在log4j.properties 里就可以这样定义logfile位置
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log
如果有多个web应用,怕webapp.root变量重复,可以在context-param里定义webAppRootKey。

当我们定义完log4j.properties后,剩下的就是在需要记录的class中new 出Logger了

阅读(517) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~