在实际的项目开发和维护中,日志是经常用到的一个内容。遇到问题的时候,经常需要通过日志去查出问题的所在并解决问题。
通常我们会用:
System.out.println(xxx);
来打印运行中所需要的内容。但在日志非常多的情况下,或者在项目上线的情况下,这种方式就狠不实用了。总不能盯着控制台看日志吧?如果想看前段时间的日志呢?如果要大批的改变日志打印出的内容呢?如果想只看异常信息的日志呢?所以,要使用日志组件。
Java中的日志组件有很多,如:Apache的log4j、commons-logging.jar,slf4j(slf4j做的是包装简化的工作,是把底层jdk中的日志等内容包装了)。jdk中也有日志,java.util.logging.Logger。目前在工作中接触的也就是log4j了。
log4j是apache下的一个开源项目。官网: http://logging.apache.org/, 其中有Apache下各个编程语言的日志组件。log4j现在有2和1,现在用1版本的(2版本目前还是beta版),下载log4j,其中包含log4j的jar包。版本下载1最新的log4j-1.2.17.jar。下载后,解压,把log4j的jar包放入项目的lib下,就可以开始使用了。
一、
(1)在程序中写日志,如下:
1 import org.apache.log4j.Logger; 2 3 public class LoggerTest { 4 private Logger log = Logger.getLogger(LoggerTest.class);//创建Logger对象,构造函数的参数写该类的class,表明是该类中的日志,日志中打印的信息中,类名也是这个 5 6 public void add() { 7 //1. 写日志 8 log.debug("LoggerTest debug message"); 9 log.info("LoggerTest info message"); 10 log.warn("LoggerTest warn message"); 11 log.error("LoggerTest error message"); 12 log.fatal("LoggerTest fatal message"); 13 //log输出的规则: debug < info < warn < error < fatal 14 } 15 }
log4j中的日志分五个级别,分别是debug、info、warn、error、fatal,它们的级别高低是:debug < info < warn < error < fatal。在配置文件中可以设置日志的输出级别,只有该级别的和高于该级别的日志才可以被看到。比如,在配置文件中设置的输出级别是warn,那么只有输出级别为warn、error、fatal的日志才会输出,debug和info的日志不会被输出。
该例子中,当执行到log.xxx(xxx);方法的时候,日志就会按照配置文件中的设置输出。接下来看如何写配置文件。
(2)写配置文件
在源文件包中建一个名为log4j.properties的文件(文件名固定)。
下载的log4j包中,example文件夹里是一些例子,可以参考其中的sort1.properties,sort2.properties...来写配置文件。
官网上的Java Doc是log4j的API,供查询参考。
①先看一个基本的写法:
1 log4j.appender.A1=org.apache.log4j.ConsoleAppender 2 log4j.appender.A1.layout=org.apache.log4j.PatternLayout 3 log4j.appender.A1.layout.ConversionPattern=(%d)[%m]--%l%n 4 5 log4j.rootLogger=DEBUG,A1
第一行:表示日志的输出方式。A1是我们自己起的名字。值是ConsoleAppender类的完全限定名。ConsoleAppender表示在控制台上输出。
第二行:日志的输出形式
第三行:输出的格式,其中的括号、中括号、横线,都是普通字符,为了显示的好看而已,没有其他含义。各个"%"+字母的含义如下:
1 %m 输出代码中指定的消息 2 %p 输出优先级, 即DEBUG, INFO, WARN, ERROR, FATAL 3 %r 输出自应用启动到输出该log信息耗费的毫秒数 4 %c 输出所属的类目, 通常就是所在类的全名 5 %t 输出产生该日志事件的线程名 6 %n 输出一个回车换行符, Windows平台为“/r/n” , Unix平台为“/n” 7 %d 输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如: %d{yyy MMM dd 8 HH:mm:ss , SSS} 9 %l 输出日志事件的发生位置, 包括类目名、 发生的线程, 以及在代码中的行数。
第五行:rootLogger表示,src代码包下的所有包的日志级别,和使用的配置的名字。
%m是log.debug等里面写的内容
②当项目部署到服务器上后,通常把日志存在文件中,便于查找问题时使用,写法如下:
1 log4j.appender.fout=org.apache.log4j.FileAppender 2 log4j.appender.fout.layout=org.apache.log4j.PatternLayout 3 log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n 4 log4j.appender.fout.file=C:/logs/system.log5 log4j.rootLogger=DEBUG, fout
第一行:使用FileAppender
第四行:写上存放日志的路径
③上一种方法日积月累之后,日志文件会变的非常大,可能上G。查看这么大的log文本,实在是不方便。通常会按照日期存放日志。
1 log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender 2 log4j.appender.fout.layout=org.apache.log4j.PatternLayout 3 log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n 4 log4j.appender.fout.DatePattern=‘.‘ yyyy-MM-dd5 log4j.appender.fout.Threshold=INFO 6 log4j.appender.fout.file=C:/logs/x.log
第一行:使用DailyRollingFileAppender
第四行:表示按照日来存放日志,到了第二天,第一天的日志名称就自动由"x.log"变成"x年-月-日.log"
第五行:表示存到文件中的日志的级别。如果同时写的有:log4j.rootLogger=DEBUG, fout级别以第五行的为准
该部分可以写多个,然后设置不同的log级别,这样不同级别的log就存放在不同的文件里了。
④日志也可以根据源文件的包来存放
1 log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender 2 log4j.appender.fout.layout=org.apache.log4j.PatternLayout 3 log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n 4 log4j.appender.fout.DatePattern=‘.‘ yyyy-MM-dd 5 log4j.appender.fout.file=C:/logs/x.log 6 7 log4j.logger.com.google=ERROR, fout
第七行:log4j.logger后面加上包名,表名这个包里的日志的输出设置是fout,级别是error