一、介绍
Log4j是Apache基金会下的一个开源的日志组件。其强大的日志功能使得其在Java项目中应用十分广泛,其官方网站为:http://logging.apache.org/log4j/1.2/
二、Log4j详解
1、Log4j组成
Log4j主要有三个组件组成:日志等级组件(logger)、日志输出组件(appender)和日志格式组件(layout)。
(1)日志等级组件Logger
该组件是Log4j的核心组件,包含了Log4j组件的核心内容:日志等级以及等级继承关系。日志等级中记载等级优先级:OFF>FALEL>ERROR>WARNING>INFO>DEBUG>ALL。
等级继承关系:使用的是最近的父类的等级。官网通过给出着四个例子讲述了日志等级的继承关系。
(2)日志输出器Appender
该组件定义了输出器将日志输入的目标、使用的输出类等多种信息,通过该类的属性的赋值,将经过该输出器的数据输出到配置信息规定的位置。
(3)日志格式组件Layout
该组件也是输出器的一个属性,不过确实单独的组件存在,该组件实现输出时的信息格式。
三、Log4j配置文件
1、配置文件组成
### set log levels ### log4j.rootLogger = debug , stdout , log ### stdout输出器输出到控制台 ### 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{ABSOLUTE} %5p %c{ 1 }:%L - %m%n ### log输出器输出到日志文件### log4j.appender.log = org.apache.log4j.DailyRollingFileAppender log4j.appender.log.File = logs/log.log log4j.appender.log.Append = true log4j.appender.log.Threshold = DEBUG ## 输出DEBUG级别以上的日志 log4j.appender.log.layout = org.apache.log4j.PatternLayout log4j.appender.log.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
(1)log4j.rootLogger=[level],appenderName1,appenderName2
该属性有多个参数,第一个[level]参数定义初始化Log4j系统时所允许的最低级别。后面的参数则定义了Log4j系统初始化了几个日志输出器。上例则定义该Log4j系统会获取Debug以上级别(包括debug)的日志信息。后两个参数则表示初始化两个输入器stdout输出器和log输出器。
(2)输出器配置
上述例子中剩余的两段属性分别是对stdout、log输出器的属性配置。分别对输出器使用的类、输出的目标位置、输出的位置和出书格式的定义。
2、配置文件属性介绍
(1)log4j.rootLogger=[level],appenderName1,appenderName2
表示该Log4j系统初始化日志信息接收的级别和生成输出器的名称
(2)log4j.appender.appenderName=appendClass
该属性定义了输出器所使用的输出器类类,一共有五种:
org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
这五种类分别代表该输出器将日志信息进行输出的方式。
(3)log4j.appender.appenderName.layout=layoutClass
该属性定义了文件以什么样的格式进行数据输出类,该类一共有4中
org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
(4)控制台配置属性
log4j.appender.stdout.Target=System.out //如果属性没有定义,则默认使用System.out
log4j.appender.stdout.Threshold=Debug(过滤器,大于该大于等于该等级的信息才可悲控制台进行输出)
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n(输出内容的格式)
(5)日志文件配置属性
log4j.appender.log.File=filePath(日志文件的位置)
log4j.appender.log.ImmediateFlush=true(输出器的内容是否立刻进行写入,默认为true)
log4j.appender.log.Append=true(继续想日志文件中写)
log4j.appender.log.Threshold=debug(日志文件过滤器,大于等于该等级的被写入到日志文件中)
log4j.appender.log.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n(在日志文件中显示的内容格式)
3、输出格式介绍
%p : 输出日志优先级,即DEBUG、INFO、WARN、ERROR等信息
%d :显示当前时间,默认为IOS80601,可在%d{ yyyy MM dd hh:mm:ss}进行显示的定义
%c :显示该信息所属的类
%t :显示所在线程的名称
%F :显示日志文件写入的文件内容
%L :显示错误行号
%r :显示从应用启动后,到日志进行显示的毫秒数
%m: 输出代码中指定的消息,产生的日志具体信息
%n : 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
三、使用实例
1、在Java项目中的使用
(1)下载log4j的jar包:log4j-1.2.17.jar
(2)将该包引入到Java项目中,并加入到classpath中
(3)在项目根目录下创建配置文件log4j.properties文件
### \u8BBE\u7F6E### log4j.rootLogger = debug,stdout,Log ### \u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ### 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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n ### \u8F93\u51FADEBUG \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=E://logs/error.log ### log4j.appender.Log = org.apache.log4j.DailyRollingFileAppender log4j.appender.Log.File = E://logs/log.log log4j.appender.Log.Append = true log4j.appender.Log.Threshold = DEBUG log4j.appender.Log.layout = org.apache.log4j.PatternLayout log4j.appender.Log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
package log4j; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class Test { private static Logger logger=Logger.getLogger(Test.class); public static void main(String[] args) { PropertyConfigurator.configure("log4j.properties"); logger.debug("this is a debug"); logger.info("this is a info"); logger.error("this is a error"); } }(5)执行结果
控制台的输出结果:
日志文件的输出结果
2、在Java web项目中的使用(不适用任何框架,该处使用listener进行Log4j初始化)
(1)将log4j的jar的jar包加载到项目的WEB-INF/lib/文件夹下,并将文件引入到classpath中
(2)在WEB-INF文件下创建log4j的配置文件log4j.properties
#the properties log4j.rootLogger = DEBUG,stdout,Log #the stdout 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=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n #the log file property log4j.appender.Log=org.apache.log4j.DailyRollingFileAppender log4j.appender.Log.File=log/GeowayMap.log log4j.appender.Log.Append=true log4j.appender.Log.Threshold=DEBUG log4j.appender.Log.layout=org.apache.log4j.PatternLayout log4j.appender.Log.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n(3)修改web.xml文件
<listener> <description>start the log4j</description> <listener-class>com.log4j.Log4jInit</listener-class> </listener>生成一个监听器,每当网站启动时,该监听器被启动,并初始化该log4j文件
(4)创建该监听器文件
package com.log4j; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import sun.util.logging.resources.logging; public class Log4jInit implements ServletContextListener { private static Logger logger=Logger.getLogger("Log4jInit.class"); @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub logger.info("log4jinit class destroyed"); } @Override public void contextInitialized(ServletContextEvent sce) { // TODO Auto-generated method stub //得到servletContext对象的方法 ServletContext sc = sce.getServletContext(); //指明文件的相对路径就能够得到文件的绝对路径 String path = sc.getRealPath("WEB-INF/log4j.properties"); //启动服务器的时候加载日志的配置文件 PropertyConfigurator.configure(path); logger.info("log4j Initialized"); } }
该处的Log4j内容总结的不算很全。下面两个链接是比较也比较详细的介绍了Log4j的情况
http://www.codeceo.com/article/log4j-usage.html
http://blog.csdn.net/azheng270/article/details/2173430/