Log4j做为一个强大的日志记录工具,得到了广泛的应用。
一、为什么要使用Log4j
做为一款日志记录工具Log4j为我们提供了对程序问题的跟踪,在开发阶段,我们可以发现程序的问题,进行排错。在产品阶段,记录程序运行的状况。Log4j打破了System.out.println()的局限性
1.不能在运行时,打开或者关闭
2.不能选者包或者类,在运行的时候打开或者关闭,无法针对某包,和某个类
3.输出的信息没有分级
4.只能输出文本信息
5.不能改变输出的位置
二、Log4j的基本概念
Log4j的三大概念:Logger/Appender/Layout
Logger: 完成日志信息的处理,使用这个对象来进行输出
Logger继承了Category,同时继承了父类中的debug(),warn()等方法,Log4j的级别:All,trace,debug,info,warn,error,fatal,off 同时从左到右级别越来越高,即All<trace<debug<info<warn<error<fatal<off,最为常用的是debug<info<warn<error这四个
Appender:设置日志信息的去向,使用这个对象来定义将日志信息输出到哪里
在Appender这个接口中,有多种不同的实现类,它们分别处理信息的不同去向:AppenderSkeleton, AsyncAppender, ConsoleAppender, DailyRollingFileAppender, ExternallyRolledFileAppender, FileAppender, JDBCAppender, JMSAppender, LF5Appender, NTEventLogAppender, NullAppender, RollingFileAppender, SMTPAppender, SocketAppender, SocketHubAppender, SyslogAppender, TelnetAppender, WriterAppender
org.apache.log4j.ConsoleAppender--------------控制台
org.apache.log4j.DailyRollingFileAppender -----每天产生一个日志文件
org.apache.log4j.FileAppender-----文件
org.apache.log4j.WriterAppender---------将日志信息以串流格式发送到任意指定的地方
org.apache.log4j.RollingFileAppender------------文件大小到达指定尺寸的时候产生一个新的文件
org.apache.log4j.jdbc.JDBCAppender-------------将日志信息保存到数据库中
Layout: 设置日志信息的输出格式,使用这个对象来定义输出的格式
HtmlLayout: 以html表格形式展现
SimpleLayout: 包含日志信息的级别和信息字符串
TTCCLayout: 包含日志产生的时间,执行绪,类别等等信息
PatternLayout: 可以灵活的指定布局模式
Log4j常用的打印参数:
%p:输出优先级,即debug,info,warn,error
%r:输出自应用启动到输出该日志信息耗费的毫秒数
%t:输出产生该日志事件的线程名
%f:输出日志信息所属的类别的类别名
%c:输出日志信息所属的类的全名 例如:如果category名称是"a.b.c","%c{2}"将会输出"b.c". {2}意谓着输出“以点分隔开的category名称的后两个组件”,如果 {n}没有,将会输出整个category名称.
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以指定格式:%d{yyyy-MM-dd HH:mm:ss}或%d{HH:mm:ss,SSSS}
%l:输出日志事件的发生位置,包括类目名,发生的线程,以及在代码中的行数
%m:输出代码指定的消息
%n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
%%:输出一个"%"字符
%C:输出日志消息产生时所在的类名,如果类名是“test.page.Class1”%C{1}表示输出类名"Class1",%C{2}输出"page.Class1",而%C则输出"test.page.Class1"。
%M:输出日志消息产生时的方法名称
%F:输出日志消息产生时所在的文件名称
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
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字符,就从左边较远处的字符截掉。
三、Log4j的基本配置和使用
常用log4j配置,一般可以采用两种方式,.properties和.xml,下面举两个简单的例子:
1. log4j.properties
### 把日志信息输出到控制台 ###
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=%d{yyyy-MM-dd HH:mm:ss}%m%n
### 把日志信息输出到日志文件:shaolong.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=shaolong.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l%m%n
### 把日志信息输出到Html:shaolong.html ###
log4j.appender.html=org.apache.log4j.RollingFileAppender
log4j.appender.html.File=shaolong.html
log4j.appender.html.MaxFileSize=500KB
log4j.appender.html.MaxBackupIndex=1
log4j.appender.html.layout=org.apache.log4j.HTMLLayout
### 设置优先级,以及输出源 ###
log4j.rootLogger=debug,stdout,file,html
2. log4j.xml
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="cn.shaolong" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="shao_long.log"/>
<param name="MaxBackupIndex" value="1" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>
<root>
<level value="debug" />
<appender-ref ref="cn.shaolong" />
</root>
</log4j:configuration>
3. 配置文件加载方法:
package cn.shaolong.log4j;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class TestTeacher {
public static void main(String []args) {
Teacher t = new Teacher();
DOMConfigurator.configure("log4j.xml");
//PropertyConfigurator.configure("log4j.properties");
//Logger logger = Logger.getLogger(TestTeacher.class.getName());
Logger logger = Logger.getLogger("cn.shaolong");
try {
logger.debug("请正确设置教员的编号");
t.setId("008");
} catch(IllegalArgumentException e) {
logger.info(e.getMessage());
}
}
}
当采用自动载入.propertie和xml时,优先采用的是xml
可以使用log4j中的DOMConfigurator来加载.xml文件 PropertyConfigurator来加载properties文件
四、 项目使用log4j
在web 应用中,可以将配置文件的加载放在一个单独的servlet中,并在web.xml中配置该servlet在应用启动时候加载。
对于在多人项目中,可以给每一个人设置一个输出通道,这样在每个人在构建Logger时,
用自己的域名称,让调试信息输出到自己的log文件中。
五、关于Log4j性能的影响
Log4j对程序的运行的性能其实是非常小的,我们还可以通过下面的方式来,降低性能的影响
if (log.isDebugEnabled()) {
log.debug("x=" + x)
}
在程序中输出某种级别的日志消息之前,提倡先调用以上方法来判断该级别的日志是否允许输出,
这有助于提高应用的性能。
例如以下代码先把日志消息添加到StringBuffer中,最后在调用日志器的debug()方法输出日志:
StringBuffer sb = new StringBuffer();
sb.append("Login Successfful -");
sb.append("Name:");
sb.appand(userView.getFirstName());
sb.appand(" ");
sb.appand(userView.getLastName());
sb.appand("-");
sb.appand("Email:");
sb.appand(userView.getEmailAddress());
log.debug(buf.toString());
对于以上代码,如果日志器实际上不允许输出DEBUG级别的日志,那么执行日志器的debug()方法不会输出任何消息,
此时向StringBuffer中添加消息的一大串操作都将是多余的。为了提高性能,可以合理地使用isDebugEnabled()等其他级别方法,
避免应用执行多余到的操作:
if(log.isDebugEnabled()){
StringBuffer sb = new StringBuffer();
sb.append("Login Successfful -");
sb.append("Name:");
sb.appand(userView.getFirstName());
sb.appand(" ");
sb.appand(userView.getLastName());
sb.appand("-");
sb.appand("Email:");
sb.appand(userView.getEmailAddress());
log.debug(buf.toString());
}
六.总结
了解如何配置logger
log4j.rootLogger=[级别],[使用哪个appender]
log4j.logger.[logger的名称(类路径)]=[级别],[使用哪个appender]
了解如何配置appender
log4j.appender.[appender的名称]=[appender 类别]
log4j.appender.[appender的名称].[appender的属性名]=[appender的属性值]
如果:对于ConsoleAppender来说,可以配置的target属性为System.out,而对于FileAppender来说,可以配置它的File属性为一个文件名
了解如何配置layout
log4j.appender.[appender的名称].layout=[layout 类别]
log4j.appender.[appender的名称].[layout的属性名]=[layout的属性值]
一、为什么要使用Log4j
做为一款日志记录工具Log4j为我们提供了对程序问题的跟踪,在开发阶段,我们可以发现程序的问题,进行排错。在产品阶段,记录程序运行的状况。Log4j打破了System.out.println()的局限性
1.不能在运行时,打开或者关闭
2.不能选者包或者类,在运行的时候打开或者关闭,无法针对某包,和某个类
3.输出的信息没有分级
4.只能输出文本信息
5.不能改变输出的位置
二、Log4j的基本概念
Log4j的三大概念:Logger/Appender/Layout
Logger: 完成日志信息的处理,使用这个对象来进行输出
Logger继承了Category,同时继承了父类中的debug(),warn()等方法,Log4j的级别:All,trace,debug,info,warn,error,fatal,off 同时从左到右级别越来越高,即All<trace<debug<info<warn<error<fatal<off,最为常用的是debug<info<warn<error这四个
Appender:设置日志信息的去向,使用这个对象来定义将日志信息输出到哪里
在Appender这个接口中,有多种不同的实现类,它们分别处理信息的不同去向:AppenderSkeleton, AsyncAppender, ConsoleAppender, DailyRollingFileAppender, ExternallyRolledFileAppender, FileAppender, JDBCAppender, JMSAppender, LF5Appender, NTEventLogAppender, NullAppender, RollingFileAppender, SMTPAppender, SocketAppender, SocketHubAppender, SyslogAppender, TelnetAppender, WriterAppender
org.apache.log4j.ConsoleAppender--------------控制台
org.apache.log4j.DailyRollingFileAppender -----每天产生一个日志文件
org.apache.log4j.FileAppender-----文件
org.apache.log4j.WriterAppender---------将日志信息以串流格式发送到任意指定的地方
org.apache.log4j.RollingFileAppender------------文件大小到达指定尺寸的时候产生一个新的文件
org.apache.log4j.jdbc.JDBCAppender-------------将日志信息保存到数据库中
Layout: 设置日志信息的输出格式,使用这个对象来定义输出的格式
HtmlLayout: 以html表格形式展现
SimpleLayout: 包含日志信息的级别和信息字符串
TTCCLayout: 包含日志产生的时间,执行绪,类别等等信息
PatternLayout: 可以灵活的指定布局模式
Log4j常用的打印参数:
%p:输出优先级,即debug,info,warn,error
%r:输出自应用启动到输出该日志信息耗费的毫秒数
%t:输出产生该日志事件的线程名
%f:输出日志信息所属的类别的类别名
%c:输出日志信息所属的类的全名 例如:如果category名称是"a.b.c","%c{2}"将会输出"b.c". {2}意谓着输出“以点分隔开的category名称的后两个组件”,如果 {n}没有,将会输出整个category名称.
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以指定格式:%d{yyyy-MM-dd HH:mm:ss}或%d{HH:mm:ss,SSSS}
%l:输出日志事件的发生位置,包括类目名,发生的线程,以及在代码中的行数
%m:输出代码指定的消息
%n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
%%:输出一个"%"字符
%C:输出日志消息产生时所在的类名,如果类名是“test.page.Class1”%C{1}表示输出类名"Class1",%C{2}输出"page.Class1",而%C则输出"test.page.Class1"。
%M:输出日志消息产生时的方法名称
%F:输出日志消息产生时所在的文件名称
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
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字符,就从左边较远处的字符截掉。
三、Log4j的基本配置和使用
常用log4j配置,一般可以采用两种方式,.properties和.xml,下面举两个简单的例子:
1. log4j.properties
### 把日志信息输出到控制台 ###
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=%d{yyyy-MM-dd HH:mm:ss}%m%n
### 把日志信息输出到日志文件:shaolong.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=shaolong.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l%m%n
### 把日志信息输出到Html:shaolong.html ###
log4j.appender.html=org.apache.log4j.RollingFileAppender
log4j.appender.html.File=shaolong.html
log4j.appender.html.MaxFileSize=500KB
log4j.appender.html.MaxBackupIndex=1
log4j.appender.html.layout=org.apache.log4j.HTMLLayout
### 设置优先级,以及输出源 ###
log4j.rootLogger=debug,stdout,file,html
2. log4j.xml
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="cn.shaolong" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="shao_long.log"/>
<param name="MaxBackupIndex" value="1" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>
<root>
<level value="debug" />
<appender-ref ref="cn.shaolong" />
</root>
</log4j:configuration>
3. 配置文件加载方法:
package cn.shaolong.log4j;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class TestTeacher {
public static void main(String []args) {
Teacher t = new Teacher();
DOMConfigurator.configure("log4j.xml");
//PropertyConfigurator.configure("log4j.properties");
//Logger logger = Logger.getLogger(TestTeacher.class.getName());
Logger logger = Logger.getLogger("cn.shaolong");
try {
logger.debug("请正确设置教员的编号");
t.setId("008");
} catch(IllegalArgumentException e) {
logger.info(e.getMessage());
}
}
}
当采用自动载入.propertie和xml时,优先采用的是xml
可以使用log4j中的DOMConfigurator来加载.xml文件 PropertyConfigurator来加载properties文件
四、 项目使用log4j
在web 应用中,可以将配置文件的加载放在一个单独的servlet中,并在web.xml中配置该servlet在应用启动时候加载。
对于在多人项目中,可以给每一个人设置一个输出通道,这样在每个人在构建Logger时,
用自己的域名称,让调试信息输出到自己的log文件中。
五、关于Log4j性能的影响
Log4j对程序的运行的性能其实是非常小的,我们还可以通过下面的方式来,降低性能的影响
if (log.isDebugEnabled()) {
log.debug("x=" + x)
}
在程序中输出某种级别的日志消息之前,提倡先调用以上方法来判断该级别的日志是否允许输出,
这有助于提高应用的性能。
例如以下代码先把日志消息添加到StringBuffer中,最后在调用日志器的debug()方法输出日志:
StringBuffer sb = new StringBuffer();
sb.append("Login Successfful -");
sb.append("Name:");
sb.appand(userView.getFirstName());
sb.appand(" ");
sb.appand(userView.getLastName());
sb.appand("-");
sb.appand("Email:");
sb.appand(userView.getEmailAddress());
log.debug(buf.toString());
对于以上代码,如果日志器实际上不允许输出DEBUG级别的日志,那么执行日志器的debug()方法不会输出任何消息,
此时向StringBuffer中添加消息的一大串操作都将是多余的。为了提高性能,可以合理地使用isDebugEnabled()等其他级别方法,
避免应用执行多余到的操作:
if(log.isDebugEnabled()){
StringBuffer sb = new StringBuffer();
sb.append("Login Successfful -");
sb.append("Name:");
sb.appand(userView.getFirstName());
sb.appand(" ");
sb.appand(userView.getLastName());
sb.appand("-");
sb.appand("Email:");
sb.appand(userView.getEmailAddress());
log.debug(buf.toString());
}
六.总结
了解如何配置logger
log4j.rootLogger=[级别],[使用哪个appender]
log4j.logger.[logger的名称(类路径)]=[级别],[使用哪个appender]
了解如何配置appender
log4j.appender.[appender的名称]=[appender 类别]
log4j.appender.[appender的名称].[appender的属性名]=[appender的属性值]
如果:对于ConsoleAppender来说,可以配置的target属性为System.out,而对于FileAppender来说,可以配置它的File属性为一个文件名
了解如何配置layout
log4j.appender.[appender的名称].layout=[layout 类别]
log4j.appender.[appender的名称].[layout的属性名]=[layout的属性值]