`
8366
  • 浏览: 821009 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类

大型网站用户行为记录的一个实现--基于clickStream(第一部分)

阅读更多

  大型互联网应用记录用户的行为是一个问题,如何在不影响用户体验的情况下,异步的追踪用户的行为,apache 的开源项目clickstream 是个不错的选择,根据session 的 建立和销毁 来记录用户的行为日志。

 

Clickstream 概述
一个用来跟踪正在你的站点上访问的用户所到达位置细节的工具。它允许你跟踪访问你的站点的“点击流”或者“传输路径”。请访问JIRA的更新日志 来了解Clickstream最近的发展。

特性

• 当用户会话产生时,开始跟踪点击流。(通过一个监听器 )
• 跟踪用户产生的每次点击信息。(通过一个过滤器 )
• 当用户会话终止时,将完整的点击流记录到文件或者PrintStream中。
• 设法发现用户是不是机器人,并进行适当的过滤(目前可以检测252种机器人)

 

下面我使用 以前的一个SSH 整合的OA  系统来做为例子,给这个系统加上 用户行为记录(先记录到控制台上),稍后我们记录到远程的日志服务器上

 

 

步骤:

 

1. 在web.xml 中加上 clickstream 的filter ,配置 clickstream 拦截的行为 ,注意顺序,需要配置在web.xml的 靠前部分

 

<!-- clickStream 配置开始-->
<filter>
		<filter-name>clickstream</filter-name>
		<filter-class>
			com.opensymphony.clickstream.ClickstreamFilter
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>clickstream</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>clickstream</filter-name>
		<url-pattern>*.html</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>clickstream</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>
	
	<filter-mapping>
		<filter-name>clickstream</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	
<listener>
		<listener-class>
			com.opensymphony.clickstream.ClickstreamListener
		</listener-class>
	</listener>
<!-- clickStream 配置结束-->

 

2.  session 超时以后,需要调用哪个方法来完成行为日志得记录?也就是把某个sessionID 关联的行为记录下来,需要我们实现一个clickstream 的接口 ClickstreamLogger 接口,在 session  超时的时候,它会调用 log 方法,在log方法中我们可以通过  遍历 list 的方式 拿到 clickstream 帮我们记录的 某个具体的 sessionID  的行为,然后我们根据自己的业务要求来进行 持久化--- 交给日志服务器

 

 

package com.demo.struts.util;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import com.opensymphony.clickstream.Clickstream;
import com.opensymphony.clickstream.ClickstreamRequest;
import com.opensymphony.clickstream.logger.ClickstreamLogger;

public class TouchLogger implements ClickstreamLogger{
	private static final Logger log = Logger.getLogger(TouchLogger.class);
	
	/**
	 * 由于行为采集将是一个比较消耗资源的操作(用户量大,点击量大),所以在优化方面
	 * 可以考虑以下方法:
	 * 1.每web服务器将日志信息记录在本地
	 * 2.对于用户每次登录,并不是每作一次操作都要进行一次db的数据插入,而是当该用户的session过期的时候再进行,这样避免
	 * 多次的数据库操作。但是考虑到数据采集的真实性需要在每次点击的时候将点击时间进行记录
	 * 
	 */
	public void log(Clickstream cs) {
		log.info("session超时,记录日志中~~~");
		List list = cs.getStream();
		HttpSession session = cs.getSession();
		String userName=(String)session.getAttribute("username");
		for (Iterator iter = list.iterator(); iter.hasNext();) 
		{
			ClickstreamRequest cr = (ClickstreamRequest) iter.next();
			String servletPath = null;
			if(cr.getQueryString()==null){
				servletPath = cr.getRequestURI();
			}else{
				servletPath = cr.getRequestURI()+"?"+cr.getQueryString();
			}
			//if(urllist.contains(servletPath)){
			String ip = cr.getIp();
			
		log.error("记录日志中:userName:"+userName+",IP:"+ip+",servletPath:"+servletPath);
		}
	}
	
	
}

 

 

 

3. 写 clickstream.xml (固定格式,网上抄一个),告诉 clickstream 单session 超时的时候 需要调用哪个方法来处理

 

4. 在tomcat 中配置好项目的访问路径以后启动项目,我们观察控制台,首先需要你配置下项目的 log4j.properties ,将clickstream 配置成 DEBUG 级别,方便我们观察 clickstream  的运作流程

 

   a.首先进入主页面 ,观察控制台,返现 clickstream   已经为 我们创建了一个 clickstream  流

 

 

b.输入用户名密码之后,我们做一些页面从操作,看到控制台已经 [DEBUG][2010-02-07 17:47:04] Applying clickstream filter to request.  也就是 我们做的操作已经被拦截,并且已经加入到 clickstream  流中,帮我们缓存起来了

 

 

 

c. 等待session超时,在观察控制台 ,session 超时,日志被记录

 

 

 

 

5. 下面则需要我们将 clickstream 中的数据流写到 日志服务器上,而不是控制台,这样可以吧日志保存到远程日志服务器,便于以后查找和分析用户的行为,则需要我们在项目中修改log4j.properties 的 配置文件,加上远程 服务器IP和端口

 

log4j.logger.com.demo.struts.util.TouchLogger=ERROR,A2

#日志服务器配置
log4j.appender.A2=org.apache.log4j.net.SocketAppender
log4j.appender.A2.RemoteHost = 127.0.0.1
log4j.appender.A2.Port = 12345
log4j.appender.SOCKET.LocationInfo=true

#远程服务器日志格式
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%m%n

 

 6. log4j 的日志服务器 其实就是启动一个socke ,监听本地的一个端口,有数据过来的时候,把数据持久化一下,比如记录在文件中,其实这个socket log4j已经给我们实现了,并且内部使用了多线程机制,高效的记录日志,使用fatjar(肥jar) 将下面的 类和 依赖的log4j 整体打一个jar包,对外暴漏一个启动的main方法,步骤可以参考我的  用Fat Jar Eclipse Plug-In打包可执行jar文件   http://8366.iteye.com/admin/blogs/480652

 

 

package cn.com.xinli.log;
import org.apache.log4j.net.SimpleSocketServer;

/**
 * 日志服务器 启动的时候接受两个参数
 * 第一个参数为监听端口号
 * 第二个是配置文件名称,内容和log4j.properties 内容一致,就是接受到了日志流如何保存
 * 
 * 原理:
 * 使用log4j 中的 SimpleSocketServer.main 方法 在本地启动一个 socket
 * 监听制定端口,当监听端口上有数据的时候,内部使用 多线程(Thread)机制完成 对数据流的 读取,
 * 并且会根据你制定的配置文件来保存数据
 * 
 * 
 * @author huxl
 *
 */

public class LogServer
{
	public LogServer()
	{
	}

	public static void main(String args[])
		throws Exception
	{
		
		if (args.length == 2)
		{
			String port = args[0];
			String configFile = args[1];
			System.out.println("日志服务监听端口:"+args[0]);
			System.out.println("日志服务配置文件名字:"+args[1]);
			SimpleSocketServer.main(new String[] {
				port, configFile
			});
			
		}
		else
		{
			System.out.println("日志服务器启动失败:可能是参数不正确造成,参数个数为2,第一个参数为监听端口号,第二个是配置文件名称");
			System.exit(0);
		}
	}
}

 

 

 还需要一个配置文件,就是说监听到端口上有数据了,数据该持久化到哪,是一个标准的log4j.properties文件 logServer.properties 文件内容

 

log4j.rootLogger=,A1
log4j.appender.console =org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%m%n

log4j.appender.A1 =org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.File =logfiles/testlog.txt
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%m%n

 

 

启动 :将 打好的 logServer_fat.jar 和 logServer.properties 放在同级 目录下 执行启动

 

D:\workspace\logServer>java -jar logServer_fat.jar 12345 logServer.properties


日志服务监听端口:12345
日志服务配置文件名字:logServer.properties

 

当有数据到来时 它会在当前的目录下产生 logfiles/testlog.txt 并且每天都谁产生一个 日期为文件名字的日志文件,这样,我们的日志文件就可以持久化了

 

 

   使用clickstream  最大的好处就是 可以异步的来 跟踪用户在网站上的行为,并且内部实现缓冲机制,对于高并发的大型互联网应用时一个不错的选择,利用 sessionID 来追踪用户的行为

 

 

备注:

 

1.附件中是整个项目,没有lib 文件,可以再 我的这个blog 中去下载

 

http://8366.iteye.com/admin/blogs/476923

 

 

2. 还需要 clickstream-1.0.3.jar 在附加中

 

3. 使用sql 文件来建立数据库和表结构

 

4. 导入到eclipse可以直接使用

 

 

 

 

分享到:
评论
11 楼 钱图大展 2017-03-09  
chao2751021 写道
lib包哪里去下载,找不到

10 楼 钱图大展 2017-02-28  
无法下载 
9 楼 liuhanjiang 2016-08-03  
我qq147229234
8 楼 liuhanjiang 2016-08-03  
博主 我利用您提供的方法实现博文中介绍的clickstream,在我的控制台上只显示:Applying clickstream filter to request.无法看到:用户名,IP,访问路径,我也配置clickstream.xml这个文件
   就是无法 调用TouchLogger 里面的方法
可以跟我说下不
7 楼 zqs13552522 2014-07-07  
[flash=200,200][flash=200,200][url][url][url][url][url][url][url][url][img][img][list]
[*]
引用

[/list][/img][/img][/url][/url][/url][/url][/url][/url][/url][/url][/flash][/flash]
6 楼 chao2751021 2014-05-19  
lib包哪里去下载,找不到
5 楼 8366 2011-08-28  
chenggongxun 写道
8366 写道
chenggongxun 写道
博主,您好!我利用您提供的方法实现博文中介绍的clickstream,在我的控制台上只显示:Applying clickstream filter to request.无法看到:用户名,IP,访问路径,我也配置clickstream.xml这个文件,请问如何才能实现看到:用户名,IP,访问路径,谢谢!!

你直接使用我的项目 可以成功吗?

现在可以成功了,没做什么修改,不知道为什么!谢谢您!


那就好 共同学习
4 楼 chenggongxun 2011-08-28  
8366 写道
chenggongxun 写道
博主,您好!我利用您提供的方法实现博文中介绍的clickstream,在我的控制台上只显示:Applying clickstream filter to request.无法看到:用户名,IP,访问路径,我也配置clickstream.xml这个文件,请问如何才能实现看到:用户名,IP,访问路径,谢谢!!

你直接使用我的项目 可以成功吗?

现在可以成功了,没做什么修改,不知道为什么!谢谢您!
3 楼 8366 2011-08-26  
chenggongxun 写道
博主,您好!我利用您提供的方法实现博文中介绍的clickstream,在我的控制台上只显示:Applying clickstream filter to request.无法看到:用户名,IP,访问路径,我也配置clickstream.xml这个文件,请问如何才能实现看到:用户名,IP,访问路径,谢谢!!

你直接使用我的项目 可以成功吗?
2 楼 chenggongxun 2011-08-25  
请问clickstream是不是只能过滤servlet?
1 楼 chenggongxun 2011-08-25  
博主,您好!我利用您提供的方法实现博文中介绍的clickstream,在我的控制台上只显示:Applying clickstream filter to request.无法看到:用户名,IP,访问路径,我也配置clickstream.xml这个文件,请问如何才能实现看到:用户名,IP,访问路径,谢谢!!

相关推荐

    大型网站用户行为记录的一个实现--基于clickStream(第二部分)

    【标题】:“大型网站用户行为记录的一个实现--基于clickStream(第二部分)” 在这个主题中,我们将深入探讨如何在大型网站环境中实现用户行为记录,特别是利用clickStream技术。clickStream是指用户在网站上的点击...

    myoa.rar_基于clickstream

    【标题】"myoa.rar_基于clickstream" 指的是一个使用Clickstream技术实现的大型网站用户行为记录系统。Clickstream技术主要用于收集、分析和理解用户在网站上的浏览路径和交互行为,这对于网站优化、用户体验提升...

    嵌入式八股文面试题库资料知识宝典-深圳禾苗通信科技有限公司.zip

    嵌入式八股文面试题库资料知识宝典-深圳禾苗通信科技有限公司.zip

    Arduino UART实验例程【正点原子EPS32S3】

    Arduino UART实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。

    电力弹簧技术在主动配电网规划与运行优化调度中的应用研究

    内容概要:本文详细探讨了电力弹簧技术在主动配电网规划及运行优化调度中的应用。首先介绍了电力弹簧技术作为智能电网调控手段的优势,如自适应性强、响应速度快、节能环保等。接着阐述了主动配电网规划的目标和策略,包括优化电网结构、提高能源利用效率和降低故障风险。随后讨论了运行优化调度的原则和方法,强调了实时监测、智能调度策略以及优化调度模型的重要性。最后通过实际案例分析展示了电力弹簧技术在提升电网稳定性、可靠性和能效方面的显著效果,展望了其广阔的应用前景。 适合人群:从事电力系统规划、运行管理的研究人员和技术人员,以及对智能电网感兴趣的学者和学生。 使用场景及目标:适用于希望深入了解电力弹簧技术及其在主动配电网规划和运行优化调度中具体应用的专业人士。目标是掌握电力弹簧技术的工作原理、优势及其在实际项目中的实施方法。 其他说明:本文不仅提供了理论分析,还有具体的案例支持,有助于读者全面理解电力弹簧技术的实际应用价值。

    honor_1.145_testgray20250427.apk

    honor_1.145_testgray20250427.apk

    嵌入式八股文面试题库资料知识宝典-【开发】嵌入式开源项目&库&资料.zip

    嵌入式八股文面试题库资料知识宝典-【开发】嵌入式开源项目&库&资料.zip

    鸿蒙生态HarmonyOS:万物互联时代的操作系统革新与发展路径

    内容概要:本文详细介绍了华为推出的面向全场景的分布式操作系统HarmonyOS。HarmonyOS旨在打破设备间的壁垒,实现万物互联,通过分布式软总线和分布式任务调度等核心技术,让不同设备协同工作,如手机、平板、智能家居等设备间无缝流转任务。其应用生态涵盖教育、金融、出行等多个领域,华为通过资金、技术支持和流量扶持吸引开发者,推动生态繁荣。HarmonyOS从2019年首次发布至今,经历了多个版本迭代,性能和安全性不断提升,用户体验更加智能便捷。尽管面临应用生态丰富度不足、市场竞争压力等挑战,华为通过优化开发工具、加强市场推广等策略积极应对。未来,HarmonyOS将在分布式技术、AI融合和隐私安全等方面持续创新,并在智能家居、车联网、工业互联网等领域拓展生态。 适合人群:对操作系统技术感兴趣的专业人士、开发者、科技爱好者。 使用场景及目标:①了解HarmonyOS的技术架构和分布式技术的特点;②探讨HarmonyOS在智能家居、车联网等领域的应用前景;③评估HarmonyOS对现有操作系统市场的潜在影响。 阅读建议:HarmonyOS作为一款面向全场景的操作系统,不仅涉及技术实现,还包括生态建设和用户体验。因此,在阅读过程中,应重点关注其技术优势、应用场景及未来发展潜力,结合自身需求思考其在实际生活和工作中的应用价值。

    少儿编程scratch项目源代码文件案例素材-简单杀戮.zip

    少儿编程scratch项目源代码文件案例素材-简单杀戮.zip

    基于阻抗控制和工艺优化的机器人磨抛技术研究.pdf

    基于阻抗控制和工艺优化的机器人磨抛技术研究.pdf

    少儿编程scratch项目源代码文件案例素材-扛住别被压.zip

    少儿编程scratch项目源代码文件案例素材-扛住别被压.zip

    【操作系统领域】HarmonyOS架构解析:分布式设计与全场景智能应用的创新实践

    内容概要:本文详细介绍了华为自主研发的面向全场景的分布式操作系统——HarmonyOS的架构设计及其在智能家居、智能穿戴、智慧出行等领域的应用。HarmonyOS采用分层架构,包括内核层、系统服务层、框架层和应用层,各层分工明确,协同工作,为用户提供稳定、高效、智能的操作系统。其核心特性包括分布式架构、微内核设计、组件化开发和一次开发多端部署,这些特性使得不同设备能够实现互联互通和资源共享,为用户带来无缝的全场景智能体验。此外,文章还探讨了HarmonyOS面临的生态建设和兼容性挑战,以及未来的发展前景和技术创新方向。 适合人群:对操作系统架构感兴趣的科技爱好者、智能设备开发者及相关行业从业者。 使用场景及目标:①了解HarmonyOS架构设计及其在智能家居、智能穿戴、智慧出行等领域的具体应用;②掌握HarmonyOS的核心特性,如分布式架构、微内核设计、组件化开发和一次开发多端部署;③探讨HarmonyOS面临的挑战及其未来发展方向。 其他说明:HarmonyOS的出现不仅为华为在智能设备领域的发展提供了有力支撑,也为整个行业的创新发展注入了新的活力。作为科技爱好者和关注者,我们应持续关注HarmonyOS的发展,共同见证它在智能设备领域创造更多的辉煌。

    嵌入式八股文面试题库资料知识宝典-linux驱动开发.zip

    嵌入式八股文面试题库资料知识宝典-linux驱动开发.zip

    开关磁阻电机技术参数与建模技术深度解析:4kW电机性能详述

    内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。

    嵌入式八股文面试题库资料知识宝典-新岸线.zip

    嵌入式八股文面试题库资料知识宝典-新岸线.zip

    基于支持向 量机和余弦相似度的故障诊断方法.pdf

    基于支持向 量机和余弦相似度的故障诊断方法.pdf

    Objective-C+ARKit实现图片识别、平面捕捉、人脸识别+源码(毕业设计&课程设计&项目开发)

    Objective-C+ARKit实现图片识别、平面捕捉、人脸识别+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 ARKit实现图片识别、平面捕捉、人脸识别 ARKit需要ios11 以及 A11处理器或更高版本设备支持 Objective-C+ARKit实现图片识别、平面捕捉、人脸识别+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 ARKit实现图片识别、平面捕捉、人脸识别 ARKit需要ios11 以及 A11处理器或更高版本设备支持~ Objective-C+ARKit实现图片识别、平面捕捉、人脸识别+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 ARKit实现图片识别、平面捕捉、人脸识别 ARKit需要ios11 以及 A11处理器或更高版本设备支持

    少儿编程scratch项目源代码文件案例素材-火柴人大战 中世纪战争.zip

    少儿编程scratch项目源代码文件案例素材-火柴人大战 中世纪战争.zip

    嵌入式八股文面试题库资料知识宝典-并行科技笔试题.zip

    嵌入式八股文面试题库资料知识宝典-并行科技笔试题.zip

Global site tag (gtag.js) - Google Analytics