今天尝试着摸索了一下log4j,在这里跟大家分享一下。
首先,给大家一个log4j的下载地址:http://logging.apache.org/log4j/1.2/download.html
解压之后,里面有一个log4j-1.2.17.jar,把它添加到工程中。
【注:文中涉及到的代码都是我自己的代码,没有普遍性,大家用的时候注意修改一下】
第一步是获取日志记录器 log4j允许开发人员定义多个Logger。
默认有一个是rootLogger,它不能通过名字检索或者引用,获得方法是使用 Logger.getRootLogger();
我使用的是自己定义的Logger: static Logger logger = Logger.getLogger("mylog");
第二步是配置log4j的环境
有三种类型
BasicConfigurator.configure ():使用默认log4j环境
PropertyConfigurator.configure ( String configFilename) :使用Java的特性编写的配置文件
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件
我使用的是第二种 PropertyConfigurator.configure("E:/project/mylog4j.properties");
注意,括号里最好写绝对路径。
第三步就是编写配置文件mylog4j.properties
这步的主要任务是确定三个内容:日志记录器(Logger),输出端(Appenders),格式化器(Layout)
如果是使用自己定义的Logger的话需要指明(如我前文题到的 mylog)
输出端有这几种:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
如果是选择输出到文件需要写明日志文件的路径(最好是绝对路径吧)
log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
选择PatternLayout的话需要写明具体格式:
1)-X号: X信息输出时左对齐。
2)%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR。
3)%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921。
4)%r: 输出自应用启动到输出该log信息耗费的毫秒数。
5)%c: 输出日志信息所属的类目,通常就是所在类的全名。
6)%t: 输出产生该日志事件的线程名。
7)%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)。
8)%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
9)%%: 输出一个"%"字符。
10)%F: 输出日志消息产生时所在的文件名称。
11) %L: 输出代码中的行号。
12)%m: 输出代码中指定的消息,产生的日志具体信息。
13)%n: 输出一个回车换行符,Windows平台为" ",Unix平台为" "输出日志信息换行。
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式,如:
(1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
(2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
(3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
(4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
我的mylog4j.properties如下:
log4j.logger.mylog=INFO,A
log4j.appender.A=org.apache.log4j.FileAppender log4j.appender.A.File=e:/project/mylog4j.log
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%F %L %d %p %c - %m%n
第四步就是在代码中使用log4j插入记录信息
logger.info("this is an info"); logger.warn("this is a warn"); logger.error("this is an error"); logger.bebug("this is a bebug");
每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。 log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。
error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
warm 表明会出现潜在的错误情形。
info 一般和在粗粒度级别上,强调应用程序的运行全程。
debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
也可以在代码中创建一个自定义类,将相关配置及函数调用写在一起
1 public class log4j { 2 static Logger logger = Logger.getLogger("mylog"); 3 public static void output(String level, String msg){ 4 PropertyConfigurator.configure("E:/project/mylog4j.properties"); 5 6 if(level.equals("debug")){ 7 if (logger.isDebugEnabled()){ 8 logger.debug(msg); 9 } 10 }else if(level.equals("info")){ 11 if (logger.isInfoEnabled()){ 12 logger.info(msg); 13 } 14 }else if(level.equals("warn")){ 15 logger.warn(msg); 16 }else if(level.equals("error")){ 17 logger.error(msg); 18 } 19 } 20 }
在代码中使用可以直接按以下格式使用:
1 public static void main(String[] args) 2 { 3 System.out.println(("haha")); 4 System.out.println(("hehe")); 5 log4j.output("info","this is info."); 6 log4j.output("info","this is debug."); 7 log4j.output("warn","this is warn."); 8 log4j.output("error","this is error."); 9 }
参考资料:
Apache Log4j配置说明http://zhangjunhd.blog.51cto.com/113473/21014
使用Log4j进行日志操作http://www.ibm.com/developerworks/cn/java/l-log4j/
lo4gj详解与实战http://www.iteye.com/topic/378077
log4j使用笔记http://www.cnblogs.com/eflylab/archive/2007/01/11/618001.html