最近使用到jetty服务器,但是配置它的log时遇见了一些问题。
jetty日志原理:
jetty实现了它自己的一个日志工厂类:org.eclipse.jetty.util.log.Log。该类被classloader加载的时会在classpath中查找有没有可用的日志接口(默认是slf4j,可以通过配置启动参数-Dorg.eclipse.jetty.util.log.class=xxxx来指定日志接口),如果找不到就用默认的标准输出日志实现(org.eclipse.jetty.util.log.StdErrLog)。
实现方法
jetty/lib/ext下放入3个jar包slf4j-api-1.4.3.jar,slf4j-log4j12-1.4.3.jar,log4j-1.2.12.jar
slf4j-api-1.4.3.jar slf4j的接口定义包
slf4j-log4j12-1.4.3.jar slf4j到log4j的转接包
log4j-1.2.12.jar 具体的日志实现包
jetty/resources 文件夹下已经提供一个默认的log4j.properties
启动的OPTIONS添加“ext,resources” ,这样就把jetty/lib/ext和jetty/resources路径添加到启动classpath中
===================================================================================================================
1、web容器日志的配置
Jetty6本身并不带slf4j,当它在启动时会试图加载slf4j的类,如果成功就使用org.mortbay.log.Slf4jLog来记录日志,将日志信息发给底层的日志系统。如果失败,就使用org.mortbay.log.StdErrLog来记录日志,也就是将日志信息输出到操作系统的stderr文件(标准错误输出)。
在实际使用的时候,发现,有些服务器上面,不会显示http请求的log。查阅后,发现,这是jetty的一个bug。解决方案:
在Jetty6自带的配置文件etc/jetty.xml中,已经包括了对于HTTP请求日志的配置。但是默认情况下并不会记录HTTP日志,除非你将它放在handlers的设置中,即:
<Set name="handlers">
<Array type="org.mortbay.jetty.Handler">
<Item>
<Ref id="RequestLog"/>
</Item>
......
</Array>
</Set>
注意,RequestLog这个Item最好放在最前面,否则在Linux上会不起作用。
在默认的请求日志的配置中,要加上这段:
<Array type="String">
<Item>/image/*</Item>
<Item>*.css</Item>
</Array>
</Set>
即,不需要记录对于图片和css文件的请求。
另外,默认的HTTP请求日志文件的位置:
<Arg><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.request.log</Arg>
需要改为:
<Arg><SystemProperty name="jetty.home" default="."/>/logs/yyyy_mm_dd.request.log</Arg>
否则在Linux上因为找不到jetty.logs,就会把文件写到其他地方,而不是在Jetty6的logs目录下了