一、目的
我们先来说说目的,一个程序运行的时候,我们是几乎看不到其内部运作的,看到的只是我们输入的数据和程序输出给我们的结果。对于运行过程中发生了什么,我们全然不知。当你想要在用户登录时记录下登录时间以及登录的用户信息,这时就能用输出日志来完成这个功能。Java在util.logging包中给我们提供了输出日志的类和各种工具。但是我个人认为使用apache提供的log4j更加方便,仅仅在配置方面,就简单易操作,而且功能强大。
二、准备工作
第一步,我们需要到apache网站下载log4j的jar包,网址在此:点击过去
第二步,导入jar包到项目buildpath下。
三、配置文件
这一步很重要,而且配置完成了之后你会发现,日志输出太简单了。一个配置,处处使用,甚至挪到另一个项目上,配置也不会变多少。所以这里配置好了,log4j使用就方便多了。在网上看其他大神的博文,发现使用xml的配置方式比properties文件的配置方式好用很多,因为使用xml配置,可以同时让不同级别的日志信息,输出到不同的位置,也可以根据不同的配置,选择不同的日志对象来输出到自己想要的位置。
举个例子,你希望在程序中有一个LogoutLogger对象,在用户注销的时候信息输出到控制台,与此同时,你还希望有一个LoginLogger对象在用户登录的时候能把日志信息输出到login.log这个文件中。我们可以通过xml配置来实现这个需求。
以下是我针对上面的例子做出的配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"
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 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlo4.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="LogoutLogger" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="DEBUG"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
</appender>
<appender name="LoginLogger" class="org.apache.log4j.FileAppender">
<param name="File" value="logs/login.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
</appender>
<!-- 這個logger标签是用来配置:在类中可以根据appender的名称获取指定日志输出方式 -->
<!-- 如果在类中获取LogoutLog,那么通过LogoutLog这个logger输出的日志只会出现在控制台 -->
<logger name="LogoutLogger">
<appender-ref ref="LogoutLogger"/>
</logger>
<logger name="LoginLogger">
<appender-ref ref="LoginLogger"/>
</logger>
</log4j:configuration>
四、在程序中应用
1.Customer.java
模拟用户
package log4j;
import org.apache.log4j.Logger;
public class Customer {
private String name;
public Customer(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void login() {
Logger logger = Logger.getLogger("LoginLogger");
logger.info("用户"+this.name+"登陆啦");
}
public void logout() {
Logger logger = Logger.getLogger("LogoutLogger");
logger.info("用户"+this.name+"注销啦");
}
}
2.Test.java
模拟用户登录注销操作
package log4j;
public class Test {
public static void main(String[] args) {
Customer c1 = new Customer("Tom");
Customer c2 = new Customer("Jerry");
c1.login();
c2.login();
c1.logout();
c2.logout();
}
}
五、结果
1.在控制台的日志
2.在文件中的日志
最后
还有一些配置,像日志达到一定大小了之后生成另外一个文件,每天生成不同的文件,都可以通过配置文件来设置,因为暂时没有使用过其他的生成日志的方式,待以后慢慢补充。