1: Log4j使用
1): 之前调试程序使用方法
可以在程序中使用System.out.println()在控制台打印一些信息以便我们来做调试
但这样会有一些缺点,因为在我们调试完后,为了不影响代码的执行效率需要我们把之前调试的out.println()
全部找出来再删除掉。如果以后再出现问题需要调试则会重复以上的操作。
2): Log4j的作用
Log4j一样可以在控制台打印调试,但是它的输出分为多个级别,我们可以在一个配置文件里来很好的控制 它的输出
除了这样,Log4j还可以监控代码中的一些情况(如变量的变化),然后把这些信息记录到一个日志文件里,以便于以后的分析使用等等
3): 使用前提
需要导入log4j.jar包
需要在src下配置一个名为log4j.properties文件
4): 一般会有五个日志级别,DEBUG,INFO,WARN,ERROR,FATAL
而常用的日志级别基本有4个,从小到大的顺序依次是DEBUG-->INFO-->WARN-->ERROR
DEBUG 我们为程序设置的一些调试信息
INFO 为我们要显示的信息,比如登陆,参数的值
WARN 一般为警告信息
ERROR 一般为异常信息
ps: 如果日志级别是DEBUG,则会把DEBUG INFO WARN ERROR都打印
如果日志级别是INFO,则只打印INFO WARN ERROR,而比它级别低DEBUG就不会再打印了,其他同理
package com.tz.servlet.log4j;
import org.apache.log4j.Logger;
import org.junit.Test;
public class HelloLog4j {
@Test
public void test1() {
System.out.println("out.println信息");
Logger log = Logger.getLogger(HelloLog4j.class);
log.debug("debug 信息");
log.info("info 信息");
log.warn("warn 信息");
log.error("error 信息");
try {
int i = 1/0;
}catch(Exception e){
log.error(e.getMessage());
}
}
}
log4j.properties
##设置日志的级别
log4j.rootLogger=DEBUG, CONSOLE, FILE
##设置输出的目的地为(控制台)
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
##设置输出格式
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
##设置具体的格式
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %l -%m%n
##日志文件输出的目的地可以有以下:
##1: org.apache.log4j.ConsoleAppender(控制台)
##2: org.apache.log4j.FileAppender(文件)
##3: org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
##4: org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸时则会产生一个新文件)
##5: org.apache.log4j.WriterAppender(把日志信息以流格式发送到指定的地方--邮箱)
##layout表日志信息的输出格式风格,可以有如下格式
##1: org.apache.log4j.PatternLayout(可以灵活的指定布局模式)
##2: org.apache.log4j.HTMLLayout(以HTML形式布局)
##3: org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
##4: org.apache.log4j.TTCCLayout(包含日志文件产生的时间,线程,类别等等信息)
##ConversionPattern表示设置具体的格式
##%d: 输出日志时间或者日期
##%p: 输出日志信息优先级
##%t: 输出产生日志事件的线程名
##%l: 输出代码中行号
##%m: 输出 代码中指定的消息
##%n: 输出一个回车换行符
##配置信息输出的目的地(写日志文件)
log4j.appender.FILE=org.apache.log4j.FileAppender
##设置输出格式
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
##设置具体的格式
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %l -%m%n
##设置日志文件的路径
log4j.appender.FILE.File=F:/logs/log4j.log
##设置日志是否加到已有的内容下方
log4j.appender.FILE.Append=true
2: 监听器三个属性(Listener)
1): 事件源 (老鼠)
2): 事件 (老鼠偷油)
3): 监听者 (猫)
3: Servlet中有八个监听器(Listener)
1): 事件源(ServletContext, HttpSession, ServletRequest)三个域对象
2): 配置一个监听器
在web.xml中
<!-- 声明一个监听器 -->
<listener>
<!-- 监听类的全类名 -->
<listener-class>com.tz.servlet.listenerContext.ContextListener</listener-class>
</listener>
可以直接使用@WebListener注解
3): 事件源是ServletContext时
a): 生命周期监听(ServletContextListener接口)
contextInitialized(ServletContextEvent sce) --创建ServletContext后调用
contextDestroyed(ServletContextEvent sce) --销毁 ServletContext前调用
ps: 传入的事件对象(ServletContextEvent)
b): 属性监听(ServletContextAttributeListener接口)
attributeAdded(ServletContextAttributeEvent scae) --添加属性时调用
attributeRemoved(ServletContextAttributeEvent scae) --删除属性时调用
attributeReplaced(ServletContextAttributeEvent scae) --替换属性时调用
ps: 传入的事件对象(ServletContextAttributeEvent)
4): 事件源是HttpSession时
a): 生命周期监听(HttpSessionListener接口)
sessionInitialized(HttpSessionEvent se) --创建时调用
sessionDestroyed(HttpSessionEvent se) --销毁时调用
ps: 传入的事件对象(HttpSessionEvent)
b): 属性监听(HttpSessionAttributeListener接口)
attributeAdded(HttpSessionBindingEvent se) --向session中添加属性时调用
attributeRemoved(HttpSessionBindingEvent se) --在session中删除属性时调用
attributeReplaced(HttpSessionBindingEvent se) --替换属性时调用
ps: 传入的事件对象(HttpSessionBindingEvent)
5): 事件源是ServletRequest时
a): 生命周期监听(ServletRequestListener接口)
requestInitialized(ServletRequestEvent sre) --创建后调用
requestDestroyed(ServletRequestEvent sre) --销毁前调用
ps: 传入的事件对象(ServletRequestEvent)
b): 属性监听(ServletRequestAttributeListener接口)
attributeAdded(ServletRequestAttributeEvent srae) --添加属性时调用
attributeRemoved(ServletRequestAttributeEvent srae) --删除属性时调用
attributeReplaced(ServletRequestAttributeEvent srae) --替换属性时调用
ps: 传入的事件对象(ServletRequestAttributeEvent)
下面这两个监听器是不需要配置的
6): HttpSessionBindingListener
这个监听需要添加到一个实体类上
valueBound(HttpSessionBindingEvent event) --当实体对象添加到session中调用
valueUnbound(HttpSessionBindingEvent event) --当实体对象从session中移除时调用
7): HttpSessionActivationListener
这个监听需要添加到一个实体类上
sessionWillPassivate(HttpSessionEvent se) --当实体对象和session一起被纯化时则会调用
sessionDidActivate(HttpSessionEvent se) --当实体对象和seession一起被活化时则会调用
listenerContext
生命周期监听
package com.tz.servlet.listenerContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ContextListener implements ServletContextListener{
//创建ServletContext后调用
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建");
}
//销毁ServletContext之前调用
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁");
}
}
属性监听
package com.tz.servlet.listenerContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ContextListenerAttr implements ServletContextAttributeListener{
//添加属性时调用
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("在Context对象中添加了属性");
String name = scae.getName();
Object value = scae.getValue();
System.out.println(name+"=="+value);
}
//移除属性时调用
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("在Context对象中删除了属性");
String name = scae.getName();
Object value = scae.getValue();
System.out.println(name+"=="+value);
}
//替换属性时调用
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("在Context对象中替换了属性");
String name = scae.getName();
Object value = scae.getValue();
System.out.println(name+"=="+value);
}
}
listenerSession
生命周期监听
package com.tz.servlet.listenerSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener{
//创建时调用
@Override
public void sessionCreated(HttpSessionEvent se) {
}
//销毁时调用
@Override
public void sessionDestroyed(HttpSessionEvent se) {
}
}
属性监听
package com.tz.servlet.listenerSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class SessionListenerAttr implements HttpSessionAttributeListener{
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
}
}
listenerRequest
生命周期监听
package com.tz.servlet.listenerRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class RequestListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
}
}
属性监听
package com.tz.servlet.listenerRequest;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class RequestListenerAttr implements ServletRequestAttributeListener{
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
}
}