日志是软件系统中重要的一环,系统是否在正常运行或者自己的服务器很不幸地宕机了,都要通过系统日志进行分析。而在Java中使用日志,当然首选log4j,功能强大,使用方法简单明了,学习成本小到几乎没有。下面就简单地说明一下上午学习的成果。
Log4j是apache基金组织的开源项目,只说它是开源的,其它请东西请百度之。
1. 获取:
可以从log4j官网下载,或者在国内随处可以下载,注意以前版本它是有两个包的,现在只要一个包就可以(log4j-1.2.17.jar)
2. 集成到项目中
将之加入自己的项目中,eclipse可以build path,将它变成可爱的小奶瓶,就可以使用它的类了。
3. 创建配置文件
在工程的src目录下创建名为log4j.properties的配置文件,在文件中写入以下的内容:
说明:先照样将之些写进去,具体配置项的作用下面会有说明
<span style="font-size:14px;">log4j.rootLogger=info, stdout, log, errorlog
#配置根日志
log4j.Logger=search,Test
###Console ###
#对控制台输出信息的配置
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
#进行添加日志
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
#输出日志的格式匹配样式
log4j.appender.stdout.layout.ConversionPattern = [%p] %d{ABSOLUTE} [%t]:%l - %m%n
#输出样式,具体几个参数所说明见下面
### Log ###
#对输出INFO级别文件中信息的配置
log4j.appender.log = org.apache.log4j.DailyRollingFileAppender
#每日新建一个新的日志文件
log4j.appender.log.File = log/log.log
#指定的文件目录
log4j.appender.log.Append = true
#添加
log4j.appender.log.Threshold = INFO
#级别,下面会讲
log4j.appender.log.DatePattern='.'yyyy-MM-dd
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t ]%l %m%n
#指定了具体的时间格式
### Error ###
#对输出ERROR级别文件中信息的配置
log4j.appender.errorlog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlog.File = log/errorlog.log
log4j.appender.errorlog.Append = true
log4j.appender.errorlog.Threshold = ERROR
log4j.appender.errorlog.DatePattern='.'yyyy-MM-dd
log4j.appender.errorlog.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlog.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t ]%L %m%n
</span>
1. 创建需要写日志的类,以TestLog为例,看上半部分:
<span style="font-size:14px;">package com.heima.testlog;
import org.apache.log4j.Logger;
public class TestLog {
public static void main(String[] args) {
//获取日志对象
Logger log = Logger.getLogger(Class1.class);
//在日志对象中写一条日志
//这条日志会在控制台打印,并保存在log/log.log(配置文件中设定)中
log.info("abc");
//控制台的输出信息
//[INFO] 14:50:31,998 [main]:com.heima.testlog.TestLog.main(TestLog.java:12) - abc
//
//===================================分隔线===================================
//
Class1.a();
//控制台的输出信息
//[INFO] 15:18:18,148 [main]:com.heima.testlog.Class1.a(Class1.java:8) - abc
//[INFO] 15:18:18,148 [main]:com.heima.testlog.Class1.b(Class1.java:13) - abcddddd
//显示的是真正写入日志的地方
}
}
</span>
好!!!基本上已经会用Log4j了^^,是不是简单得丧心病狂,是不是没有学习成本。
下面再简单说一下log4j其它的内容,也填一下自己挖的坑。
1. 配置文件
在文件中进行了部分说明。
<span style="font-size:14px;">log4j.rootLogger=info, stdout, log, errorlog
#配置根日志
log4j.Logger=search,Test
###Console ###
#对控制台输出信息的配置
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
#进行添加日志
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
#输出日志的格式匹配样式
log4j.appender.stdout.layout.ConversionPattern = [%p] %d{ABSOLUTE} [%t]:%l - %m%n
#输出样式,具体几个参数所说明见下面
### Log ###
#对输出INFO级别文件中信息的配置
log4j.appender.log = org.apache.log4j.DailyRollingFileAppender
#每日新建一个新的日志文件
log4j.appender.log.File = log/log.log
#指定的文件目录
log4j.appender.log.Append = true
#添加
log4j.appender.log.Threshold = INFO
#级别,下面会讲
log4j.appender.log.DatePattern='.'yyyy-MM-dd
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t ]%l %m%n
#指定了具体的时间格式
### Error ###
#对输出ERROR级别文件中信息的配置
log4j.appender.errorlog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlog.File = log/errorlog.log
log4j.appender.errorlog.Append = true
log4j.appender.errorlog.Threshold = ERROR
log4j.appender.errorlog.DatePattern='.'yyyy-MM-dd
log4j.appender.errorlog.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlog.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t ]%L %m%n</span>
下面是对具体输出信息的几个符号的说明:
%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 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
要说明一下,%L与%l是不同的,%L只会显示行号,而%l会显示较多信息
2. 日志级别问题
上面已经提到了这个日志级别的问题,就是程序运行在不同的状态下会有不同的行为。
Log4j中已经定义了debug,info,warn,error和fatal等几个级别,对应级别是越来越高。只有高于某个级别,才会在那个级别上留下记录。如
logger.info(“abc”)会在INFO中留下记录,而不会在WARN和ERROR中记录信息
而logger.error(“abc”)会在ERROR及以下定义的行为中留下记录。
3. 再看上面例子中的下半部分和Class1。
<span style="font-size:14px;">package com.heima.testlog;
import org.apache.log4j.Logger;
public class Class1 {
public static void a () {
Logger log = Logger.getLogger(Class1.class);
log.info(log);
//[INFO] 15:43:16,375 [main]:com.heima.testlog.Class1.a(Class1.java:8) - org.apache.log4j.Logger@92b94c3
log.info("abc");
log.debug("i am a boy");//不会显示
b();
}
public static void b () {
Logger log = Logger.getLogger(Class1.class);
log.info(log);
//[INFO] 15:43:16,375 [main]:com.heima.testlog.Class1.b(Class1.java:16) - org.apache.log4j.Logger@92b94c3
//可见拿到的是一个日志对象
log.info("abcddddd");
}
}
</span>
Log4j是个有用的东西,可以帮助我们高度程序和在生产环境下监控系统的行为。同时也是个比较简单的组件,这只是它的一部分功能,它还有其它强大的功能,现在能力有限,先写到这里。