jsp_Log4j与监听器

本文介绍Log4j的日志记录方法及其配置,包括不同级别的日志输出及应用场景,并详细解析了Servlet监听器的工作原理,涵盖监听器的配置、实现方式以及多种类型的监听事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值