Ⅰ 很多java程序中都会专门写一个日志工厂是为什么 另外定义的这类日志接口是为了什么
方便维护写日志的级别,以及文件备份……等等一系列有段日志的操作
Ⅱ java日志的filter
Filter可以视作是servlet的加强版,主要用作对用户的请求进行预处理,或者对返回给客户端的结果进行再次加工,是一个典型的链式处理模式。本篇简单介绍filter的基本使用方法,主要涉及以下内容:
Filter的背景知识
使用Filter的流程
Filter的生命周期
一个完整的实例
一、Filter的简单介绍
Filter在英文中是过滤器的意思,当然在此处的使用也是完美的切合了它的意思,我们使用filter的主要目的就是完成一个过滤的作用。可以在一个请求到达servlet之前,将其截取进行逻辑判断,然后决定是否放行到请求的servlet。也可以在一个response到达客户端之前,截取结果进行逻辑判断,然后决定是否允许返回给客户端。所以filter有如下几个种类:
用户授权的filter:filter负责判断用户是否有权限请求该页面,给予过滤判断
日志filter:截取某个用户在本网站上的所有请求,记录轨迹
负责解码的filter:规定处理本次请求的解码方式
最后需要注意的是,一个filter过滤器可以加在多个servlet控制器上,当然多个filter过滤器也是可以加在一个servlet控制器上的。由此也是可以看出来,我们使用filter往往是对一些公共的操作进行处理,例如:判断用户权限,解码本次请求等,还比如,我们的web应用中某些页面是需要用户登录后才能访问的,以往我们都是在每个servlet页面加上判断控制,导致代码冗余,有了filter,我们可以定义一个实现了filter的过滤器,让需要判断是否登录的页面都加上这么一个过滤器,可以大大降低代码的冗余程度。
二、Filter的使用流程
在Java中如果想要自定义一个filter过滤器的话,需要继承Javax.servlet.Filter接口,这个接口中只有三个方法:
其中init和destroy方法是有默认实现的,也就是我们不是必须重写这两个方法,但是doFilter 这个方法是一个核心的方法,是我们必须要实现的。首先我们看init方法的作用,这个方法是用来初始化filter实例的,也就是当用户请求了某个拦截器而此拦截器又匹配了某个过滤器,此时web容器就会定位到该过滤器然后创建该filter类的实例对象并调用此实例的init方法,完成初始化工作。对于destroy方法毋庸置疑就是在过滤器执行结束的时候调用,主要完成对一些资源的释放。下面主要看dofilter这个方法。
doFilter方法是filter接口中的核心方法,一旦创建完该过滤器的实例之后,会执行dofilter方法,所有的过滤逻辑都是在此方法中进行的。主要有三个参数,第一个参数是一个ServletRequest对象,HttpServletRequest继承于此接口,当用户请求某个拦截器的时候,检测到此请求存在过滤器,于是会封装好本次请求的相关数据,传递给dofilter的ServletRequest参数,ServletResponse参数的来源和ServletRequest是一样的,都是由客户端封装过来的。至于第三个参数,这是一个FilterChain处理链,详细的介绍等说明了web.xml中配置filter之后。
第一步如上,创建一个继承自filter接口的类,并实现其中的三个方法。第二步是在web.xml中配置该类用于过滤哪些拦截器。web.xml代码如下:
如上述的代码,我们需要两个操作,首先是定义一个filter,指定了该filter的name和相对应的过滤器类。然后我们可以通过filter-mapping映射过滤器和URL,此处使用了两个映射,对该过滤器指定了对路径名为/a和/b的请求进行拦截。当然这个url-pattern元素的值可以有以下三种形式,完全匹配(/a/b等),目录匹配(/* 、 /abc/等),扩展名(.a,*.b等)。
了解了配置filter的主要操作之后,我们回去看过滤器类,我们说init方法是在首次创建filter实例的时候,用于执行初始化操作的,其中有个参数FilterConfig ,这是当前filter的配置信息,其中方法如下:
其实在创建filter实例的时候,web容器会将此实例对应在web.xml中的配置信息读取并封装成一个FilterConfig 对象传递给init方法,getFilterName方法就是我们在web.xml中配置的filter-name,getServletContext会获取当前servlet的上下文,当我们在定义filter的时候使用<init-param>来定义一些初始化参数的时候,就可以使用此方法来获取这些初始化参数。getInitParameterNames方法用于获取所有初始化参数的枚举集合。这样我们在init方法中就可以获取这些配置参数,初始化filter实例。
上面我们只定义了一个filter,如果我们对于一次请求需要执行多个filter,进行过滤操作的话,web容器会在你请求某个URL的时候,在web.xml中找到所有匹配的filter,按照注册的顺序以FilterChain 链的形式传递到方法doFilter的第三个参数中,而这个filterChain中只有一个方法:
如果我们在 void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) 方法中调用var3.doFilter(var1,var2),就代表此filter实例结束,则web服务器会检查FilterChain对象中是否还有filter对象(因为这是一个链,filter的数量是大于等于一的),如果没有就会放行,直接调用目标地址,如果还有filter对象,就会转而执行下一个filter。正是由于这样的机制,我们才可以对于一个URL请求添加多个filter过滤器。
三、一个简单的实例
下面通过一个简单的实例直观的感受下filter过滤器的作用:
我们首先访问set.jsp页面设置本次会话的session值,然后修改浏览器地址栏访问index.jsp页面
上述的demo只是为了简单的演示,其实使用filter可以完成大大的降低我们的代码的冗余程度。这个例子是为了演示,所以很简单。
四、Filter 的生命周期
当用户请求某个页面时候,会到web.xml中匹配是否存在能够匹配上此次请求的filter,如果有封装它的配置信息,FilterChain链。然后调用init方法,完成初始化,接着调用dofilter方法,处理核心逻辑,当此实例被销毁的时候,会调用destroy方法。
Ⅲ java中log4j和slf4j什么关系我要打印日志用哪个好呢
slf4j是日志的接口(只定义了一些方法而没有去实现),和commons-logging一样。而log4j是具体的实现(即怎么来打印日志等),和logback是一样的。
Ⅳ java日志接口怎么写
Log4J?
配置log4j.properties文件
代码内使用Logger就可以
~~~~~~~~~~~~
Ⅳ 请教一个简单的java日志怎样写
关于复java日志,下面以Log4j为例子制说明(供参考)。
1、导包(Log4j所依赖的jar包)
2、配置属性文件。如下:
//删除数据 Ⅵ 在java中如何使用记录日志API
import java.util.logging.*; Ⅶ java打印日志的几种方式 在Java 中实现记录日志的方式有很多种, 下面给你简单介绍四种: 最简单的方式,就是system.println.out(error) ,这样直接在控制台打印消息了。 Java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了。 log4j , 最强大的记录日志的方式。 可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。 commons-logging, 最综合和常见的日志记录方式, 经常是和log4j 结合起来使用。 Ⅷ java 日志接口怎么写 可以考虑用jms把日志单独发送到一个消息系统,消息系统采用apache activeMQ来实现,web系统只管往外发送日志的jms,消息系统负责日志的写,每次从日志队列中获取日志批量保存到数据库,日志表可以每天一张表,免得数据量过大影响插入速度。 Ⅸ 用JAVA定义一个接口用于查询日志文件 日志文件有ID标识,用户名,日志内容等属性; 怎么去实现
首先定义javabean,包括属性ID标识,用户名,日志内容等属性。如果使用hibernate就更简单了。用方法this.getTemplateHibernate.find("from Log");就行了,你也可以用jdbc来获取。将结果集的信息取出来即可
@RequestMapping("/delete.do")
publicStringdelete(Studentsstudents){
try{
stuService.delete(students);
}catch(Exceptione){
//直接使用
LoggerUtil.logger.error(e.getMessage());
}
return"redirect:selectAll.do";
}
public class BasicLoggingExample {
public static void main(String args[])
{
Logger logger = Logger.getLogger("BasicLoggingExample");
logger.log(Level.INFO, "Test of logging system");
}
}
getLogger
public static Logger getLogger(String name)为指定子系统查找或创建一个 logger。如果已经创建了具有给定名称的 logger,则返回该 logger。否则创建一个新的 logger。
如果创建了新的 logger,则根据 LogManager 的配置来其配置日志级别,并将日志输出发送到其父处理程序。日志配置注册在 LogManager 全局命名空间内。
参数:
name - logger 的名称。这应该是一个圆点分隔的名称,并且通常应该基于子系统的包名或类名(如 java.net 或 javax.swing)。
log
public void log(Level level,String msg)记录一条不带参数的消息。
如果当前对于给定的消息级别而言 logger 是启用的,那么将给定的消息转发到所有已注册的输出 Handler 对象。
参数:
level - 某个消息级别标识符,例如 SEVERE。
msg - 字符串消息(或消息类别中的键)。