日志系统是作为服务器端程序的一个很重要的部分。
使用Java开发的服务端程序,一般都使用Log4j这个日志文件系统,今天花了一天的时间来研究这个玩意儿,总算勉强搞出了一个能用的原型来了。
一、首先,需要在工程中引入下面几个包。刚开始我只引入了1, 3, 4三个包,一直打不出日志,不管怎么改xml配置文件都是,头都搞大了,后面查了很多博文,才发现还需要另外2个。
1.commons-logging-1.1.1.jar
2.jcl-over-slf4j-1.7.5.jar
3.log4j-1.2.16.jar
4.slf4j-api-1.7.5.jar
5.slf4j-log4j12-1.7.5.jar <---类似一个做桥接的作用,将slf4j 和log4j联系起来。在代码中我是用的slf4j的logger 和 slf4j的LoggerFactory.getLogger()。刚开始日志一直无法打到文件中,搞了好久,后来在一篇博文中看到,原来slf4j和log4j之间还需要一个桥接的。
这些都可以在maven的search中找到。
二、然后自己要在工程中写一个类,来加载和监控 log4j的配置文件。
有两个类:org.apache.log4j.xml.DOMConfigurator <---- 监控xml格式的配置文件
org.apache.log4j.PropertyConfigurator <------监控 properties格式的配置文件。
我在工程中用的是xml格式的配置文件,所以就看这个文件。
由于是servlet的web应用,所以我在servlet中来完成这个加载工作
先写一个servlet, 在init()中完成配置文件的加载工作。
public class Log4jInitServlet extends HttpServlet
{
public void init()
{
DOMConfigurator.configureAndWatch(configure_file_path, watch_interval); // 参数分别是配置文件的路径和动态监控配置文件改变的时间间隔。
}
public void doGet()
{ // do nothing
}
}
三、然后在servlet的web.xml中加上这个servlet,并且设置为启动时加载。当然,你也可以在工程代码的其他地方来加载,但是要保证在log工作的时候配置文件已经加载了。
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>Log4jInitServlet </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这样jetty启动的时候,就会执行这个servlet,去加载log4j的配置文件了。
四、接下来写xml的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!-- ========================== 自定义输出格式说明================================ -->
<!-- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL -->
<!-- %r 输出自应用启动到输出该log信息耗费的毫秒数 -->
<!-- %c 输出所属的类目,通常就是所在类的全名 -->
<!-- %t 输出产生该日志事件的线程名 -->
<!-- %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” -->
<!-- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18>日 22:10:28,921 -->
<!-- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) -->
<!--详细的格式可以参考这里-->
<!-- ========================================================================== -->
<!-- ========================== 输出方式说明================================ -->
<!-- Log4j提供的appender有以下几种: -->
<!-- org.apache.log4j.ConsoleAppender(控制台), -->
<!-- org.apache.log4j.FileAppender(文件), -->
<!-- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), -->
<!-- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), -->
<!-- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) -->
<!-- ========================================================================== -->
<!-- 输出到日志文件 -->
<appender name="FileDepender" class="org.apache.log4j.RollingFileAppender"> <--------- 定义一个appender后面的日志具体调用它
<param name="File" value="/home/xxx/jetty/logs/xxx.log"/> <-------------------- 下面这些参数都可以见名知意
<param name="Append" value="true"/>
<param name="MaxFileSize" value="10MB"/>
<param name="MaxBackupIndex" value="10"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%t] %d{yyyy-mm-dd,hh:mm:ss.SSS} %l [%p] %m%n"/>
</layout>
<!-- <filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="ERROR"/>
</filter> -->
</appender>
<!--通过<category></category>的定义可以将各个包中的类日志输出到不同的日志文件中-->
<!-- <category name="com.packagename">
<priority value="debug" />
<appender-ref ref="FileDepender" />
</category>
-->
<root>
<priority value="debug"/>
<appender-ref ref="FileDepender"/> <---------------- 指向前面定义的appender,前面可以定义多个appender,这里也可以引用多个appender
</root>
</log4j:configuration>
接着将项目打包,部署到环境上,运行起来后就会自动在指定的位置生成日志文件了。
For more details, see http://www.linuxso.com/architecture/26604.html。