Log4j
Log4j介绍
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
使用
添加JAR包
添加Log4j需要的JAR包,包括log4j和commons-loggingJAR包,如果是使用maven开发工具,则在pom.xml文件中添加如下配置即可
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
写配置文件
log4j可以使用xml文件来配置,也可以使用properties这种键值对的文件来配置,但我们大多使用后者。一般来说我们将配置文件直接放在src目录下,如果是maven工厂,则放在 src/main/resources 目录下。
例如,下面是一个Log4j的配置文件
log4j.rootCategory=INFO, file, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=target/test.log
log4j.appender.file.MaxFileSize=5120KB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
##SPRING\u6539\u4E3AWARN\u7EA7\u522B
log4j.logger.org.springframework=DEBUG
log4j.logger.org.mybatis=WARN
log4j.logger.org.apache.velocity=WARN
log4j.logger.org.apache.commons=WARN
##\u663E\u793ASQL\u8BED\u53E5\u90E8\u5206,\u751F\u4EA7\u73AF\u5883\u8BF7\u8C03\u6574\u4E3AERROR
log4j.logger.com.mybatis=DEBUG
log4j.logger.com.mybatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.mybatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
Log4j三大组件
Logger(日志类别)
ERROR
WANR
INFO
DEBUG
FATAL
Log4j建议只使用前四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。如果设置级别为WANR,则优先级高于等于WANR级别(如:IWARN、 ERROR)的日志信息将可以被输出,小于该级别的日志,如DEBUG,将不会被输出。
log4j.rootCategory=INFO, file, stdout
上面这段配置信息表示了日志的级别以及输出目的地
我们也可以通过配置Logger来配置Log4j
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中level 是日志记录的优先级:ERROR、WARN、INFO、DEBUG (由高到低)
Appender(日志输出目的地)
Appender配置了日志的输出目的地。下面中,appenderName是自己取的。在我们最上面的配置模板中,定义stuout配置为标准输出,也就是输出到控制台,定义file配置为输出到文件。
log4j.appender.appenderName = 属性值
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j.appender.appenderName.option1 = value
value可为:Threshold、ImmediateFlush、Append、File(指示文件路径)、DatePattern(日期格式)、MaxFileSize(一个文件的最大容量)、MaxBackupIndex
Layout(格式化输出日志信息)
Layout配置输出信息的格式
log4j.appender.appenderName.layout = 属性值
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.appenderName.layout.option1 = value1
- ConversionPattern (举例:%d-[ZZXTIT] %p %t %c - %m%n)
测试
package com.li.common.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.persistence.Basic;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
public class BasicServlet extends HttpServlet {
private static final long serialVersionUID = 8780356163185352965L;
private static final Log log=LogFactory.getLog(Basic.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 获取传入进来要调用的方法名称 */
String handler = req.getParameter("handler");
log.debug("方法:"+handler+" 将要被执行");
try {
/* 通过此对象获取类,再获取类中指定名称以及参数类型的方法 */
Method method = this.getClass().getDeclaredMethod(handler, HttpServletRequest.class, HttpServletResponse.class);
/* 执行方法 */
method.invoke(this, req, resp);
log.info("已经执行");
} catch (Exception e) {
log.error("出现错误");
throw new RuntimeException(e);
}
}
}