Log4j简介
Log4J是Apache的一个开放源代码项目,它是一个日志操作软件包。通过使用Log4J,可以指定日志信息输出的多种目的地,比如控制台、文件等;还可以控制每一条日志的输出格式。通过定义日志信息的级别,能够非常细致地控制日志的输出。
日志的作用
1)监视代码中变量的变化情况,把数据周期性地记录到文件中供其他应用进行统计分析工作
2)跟踪代码运行时轨迹,作为日后审计的依据。
3)担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
Log4j的三大组件
Logger:负责生成日志,并能够对日志信息进行分类筛选,即决定什么日志信息应该被输出,什么日志信息应该被忽略。
Appender:定义了日志输出的目的地,指定日志信息应该被输出到什么地方,这些地方可以是控制台、文件和网络设备等。
Layout:指定日志信息的输出格式。
一个Logger可以指定多个Appdender,即可以将日志同时输出到多个目的地;每个Appender对应一种Layout
Logger组件
public static Logger getRootLogger();
public static Logger getLogger(String name);
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
public void log(Priority p,Object message);
以上配置了一个Logger组件,名为“helloLogger”,并为它分配了一个日志级别(Priority),取值为“WARN”。一共有5种日志级别:FATAL、ERROR、WARN、INFO和DEBUG,其中FATAL的级别最高,接下来依次是ERROR、WARN、INFO和DEBUG
只有当它输出日志的级别大于或等于为Logger组件配置的日志级别时,这个方法才会被真正执行
Appender组件
常用Appender
org.apache.log4j.ConsoleAppender 日子输出到控制台
org.apache.log4j.DailyRollingFileAppender 按照日志滚动的日志文件
org.apache.log4j.FileAppender 把日子存放到一个文件中
可以通过以下方式进行配置:
log4j.logger.helloLogger=WARN,file,console
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log.txt
log4j.appender.console=org.apache.log4j.ConsoleAppender
Layout组件
Layout组件用来决定日志的输出格式
常用Layout:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)。
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)。
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)。
org.apache.log4j.TTCCLayout(包含日志线程和类别等信息)。
可以通过以下方式进行配置:
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
org.apache.log4j.PatternLayout格式:
符号 | 描述 |
%r | 自程序开始远行到输出当前日志所消耗的毫秒数 |
%t | 表示输出当前日志的线程的名字 |
%p | 表示日志的级别 |
%d | 表示输出当前日志的日期 |
%c | 表示输出当期日志的Logger的名字 |
%m%n | 表示日志信息的内容 |
Logger组件的继承
Log4J提供了一个root Logger,它是所有Logger组件的“祖先”,以下是配置root Logger的代码:
log4j.rootLogger=INFO,console
用户可以再配置文件中方便地配置存在继承关系的Logger组件,凡是在符号“.”后面的Logger组件都会成为在符号“.”前面的Logger组件的子类。例如:
log4j.apache.helloLogger=WARN
log4j.apache.helloLogger.childLogger=,file
对于以上配置代码,childLogger就是helloLogger的子类Logger组件。
Logger组件的继承关系有以下特点:
如果子类Logger组件没有定义日志级别,则将继承父类的日志级别。
如果子类Logger组件定义了日志级别,就不会继承父类的日志级别。
在默认情况下,子类Logger组件会继承父类的所有Appender,把它们加入到自己的Appender清单中。
如果把子类Logger组件的additivity标志设为false,那么它就不会继承父类的Appender。additivity标志的默认值为true。
Log4J的配置文件
Log4J支持两种配置文件格式:一种是XML格式的文件,一种是Java属性文件,采用“键=值”的形式。
1)配置Logger组件
如果配置root Logger,则语法为:
log4j.rootLogger = [priority],appenderName,appenderName,...
其中,priority是日志级别,可选值包括OFF、FATAL、ERROR、WARN、INFO、DEBUG和ALL。通过在这里定义级别,可以控制应用程序中相应级别的日志信息的开关。比如定义为INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName指定Appender组件,用户可以同时指定多个Appender组件。
如果配置用户自己的Logger组件,则语法为:
log4j.logger.loggerName=[priority],appenderName,appenderName,...
2)配置Appender组件
配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName=fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1=value1...
log4j.appender.appenderName.optionN=valueN
Log4J提供的Appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台)。
org.apache.log4j.FileAppender(文件)。
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)。
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)。
org.apache.log4j.WriterAppender(将日志信息作为数据流发送到任意指定的地方)。
3)配置Layout组件
配置Layout组件的语法为:
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1=value1...
log4j.appender.appenderName.layout.optionN=valueN
Log4J提供的Layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)。
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)。
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)。
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程和类别等信息)。
JavaWeb中使用log4j
在Web应用中使用Log4J,则可以创建一个Servlet。若在它的初始化方法中读取Log4J的配置文件并且配置Log4J环境,那么这个Servlet在Web应用启动的时候就被加载和初始化了,然后就可以在其他的Web组件中获取Logger对象并输出日志。
应将配置Log4J环境的代码放在Servlet的init()方法中,这样可以保证当Servlet被加载并初始化后,Log4J的环境就已经配置好了。
public class Log4JServlet extends HttpServlet {
public void init() throws ServletException {
//获得配置文件的完整路径
String path = getServletContext().getRealPath("/");
String propfile = path+getInitParameter("propfile");
//配置Log4J环境
PropertyConfigurator.configure(propfile);
}
}
<servlet>
<servlet-name>Log4JServlet</servlet-name>
<servlet-class>com.itheima.servlet.Log4JServlet</servlet-class>
<init-param>
<param-name>propfile</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>