offline日志分析(1)

原创 2011年01月18日 17:48:00

通过对用户的行为日志进行分析,可以发现非常有趣的用户访问模式,而且还可以利用根据日志挖掘出的信息进行资源的推荐,以及设置个性化网站等。针对用户访问模式的研究,国内外已经做了很多工作。

 

采用的技术方案是:将日志一次性读取到内存中,然后进行相应的统计分析工作。

      这种方案有2点优势:
      1.顺序读取每条记录,将信息存储在内存中,提高了效率。
      2.以函数的形式实现相应的功能,具有很好的扩展性和复用性。
 
      目前对日志的分析主要做了下面3项工作:
       1.统计各个时间段内(以1h为分割)的资源点击次数。
       2.统计各资源的总体访问次数和呈现次数(即推荐次数)。
       3.统计各资源的打星率(打星次数/呈现次数)
       以上各项功能,均是以函数形式编写,可通过传参形式进行复用,从而实现对不同种类的日志进行统计工作的分析,比如统计资源打星率的函数可以被调用,以统计资源的单击率。
      
       现在只是做了很少的工作,对日志的统计分析还要很多工作要做:
       1.统计各资源的推荐率。
       2.统计各资源的单击率。
       3.对比分析推荐的资源是否与用户的点击次数和打星次数成正相关。
       4.对比分析默认推荐的资源和按类别推荐的资源的访问次数,比较优劣,对系统的有效性和实用性进行验证。
       5.分析用户的访问路径,可以对访问过的资源进行关联分析,并利用相应的反馈信息资源,进行推荐,这样可以提高推荐的有效性。(这项工作还要对日志进行修改,添加相应的字段)
 
当然日志分析还有其他很多工作要做,我想可以参考罗老师前段时间给的Eytan Adar 的文章,也希望师兄师姐和老师多给意见和建议。
代码示例:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text;
using System.IO;
using System.Collections.Generic;
namespace LogAnalysis
{
    public partial class Function : System.Web.UI.Page
    {
        //得到所有的文件名
        string[] direc = Directory.GetFiles( @"G:/lab/source/log");
        int i = 0;
        //key:time  value:访问次数
        Dictionary<String, int> dicClick = new Dictionary<string, int>();
        protected void Page_Load(object sender, EventArgs e)
        {
            //调用函数统计各个时间段内的访问次数
            dicClick = timeAnalysis(@"G:/lab/source/log/ClickLog");
            Response.Write("time   clicks <br>");
            printInt(dicClick);

            //输出recommendition中,各种资源对应的访问数目
            Dictionary<String, int> dicRecomDefault = countAnalysis(@"G:/lab/source/log/DefaultRecommendationOfferLog");//RecommendationByCategoryOfferLog
            Dictionary<String, int> dicRecomCategory = countAnalysis(@"G:/lab/source/log/RecommendationByCategoryOfferLog");//RecommendationByCategoryOfferLog
            dicClick = countAnalysis(@"G:/lab/source/log/ClickLog");//RecommendationByCategoryOfferLog
            Response.Write("time   recommands <br>");
            //Response.Write(dicRecom.Count.ToString());
            printInt(dicClick);
            //输出打星lv
            Dictionary<String, double> dicStarRate = starRate();
            Response.Write("star   rates <br>");
            printDouble(dicStarRate);
        }
       
        //输出字典
        void printInt(Dictionary<String, int> dic)
        {
            foreach (KeyValuePair<String, int> term in dic)
            {
                Response.Write(term.Key + " :   " + term.Value + "</br>");
            }
        }
        void printDouble(Dictionary<String, double> dic)
        {
            foreach (KeyValuePair<String, double> term in dic)
            {
                Response.Write(term.Key + " :   " + term.Value + "</br>");
            }
        }

        //timeAnalysis函数得到某个时间段的访问次数
        Dictionary<String,int> timeAnalysis(String path)
        {
            Dictionary<String, int> dic = new Dictionary<string, int>();
            foreach (string dir in direc)
            {
                //处理ClickLog
                //Label1.Text += "i: " +dir;
                if (dir.StartsWith(path))//@"G:/lab/source/log/ClickLog"
                {
                    FileStream fs = new FileStream(dir, FileMode.Open);
                    StreamReader sr = new StreamReader(fs, Encoding.Default);
                    String source = string.Empty;
                    while (sr.Peek() > -1)
                    {
                        //读取文件中的每一行
                        String input = sr.ReadLine();
                        //得到时间字段,比如:12:31:31
                        String[] clickTemp = input.Split(' ');
                        //得到时间的小事字段:12
                        String [] timeTemp = clickTemp[1].Split(':');
                        //如果字典中存在此键值,则访问次数加1
                        if (dic.ContainsKey(timeTemp[0]))
                        {
                            dic[timeTemp[0]]++;
                        }
                        //键值不存在,直接加入字典中
                        else
                        {
                            dic.Add(timeTemp[0], 1);
                        }
                       
                        source += input;
                        //Label1.Text += "你猜猜:" + source;
                    }// while (sr.Peek() > -1)
                    sr.Close();
                }
                i++;
            }// foreach(string dir in direc)
           
            return dic;
        }
        //计算出现次数
        Dictionary<String, int> countAnalysis(String path)
        {
            Dictionary<String, int> dic = new Dictionary<string, int>();
            foreach (string dir in direc)
            {
                //处理ClickLog
                //Label1.Text += "i: " +dir;
                if (dir.StartsWith(path))//@"G:/lab/source/log/ClickLog"
                {
                    FileStream fs = new FileStream(dir, FileMode.Open);
                    StreamReader sr = new StreamReader(fs, Encoding.Default);
                    String source = string.Empty;
                    while (sr.Peek() > -1)
                    {
                        //读取文件中的每一行
                        String input = sr.ReadLine();
                        if (!String.IsNullOrEmpty(input.Trim()))
                        {
                            String[] countTemp = input.Split(' ');
                            //如果字典中存在此键值,则访问次数加1
                            if (dic.ContainsKey(countTemp[3]))
                            {
                                dic[countTemp[3]]++;
                            }
                            //键值不存在,直接加入字典中
                            else
                            {
                                dic.Add(countTemp[3], 1);
                            }
                        }
                      
                        source += input;
                        //Label1.Text += "你猜猜:" + source;
                    }// while (sr.Peek() > -1)
                    sr.Close();
                }
                i++;
            }// foreach(string dir in direc)
            return dic;
        }

        //计算打星率
        Dictionary<String, double> starRate()
        {
           
            double star = 0.0;
            //dicStardicStarRate key:resourceID value:访问次数
            Dictionary<String, double> dicStarRate = new Dictionary<string, double>();
            Dictionary<String, int> dicRecom = countAnalysis(@"G:/lab/source/log/DefaultRecommendationOfferLog");
            Dictionary<String, int> dicStar = countAnalysis(@"G:/lab/source/log/StarLog");
            foreach(KeyValuePair<String,int> dicR in dicRecom)
            {
                int totalNum = dicRecom[dicR.Key];
                //Response.Write("total num is:" +totalNum);
                foreach(KeyValuePair<String,int> dicS in dicStar)
                {
                    if (dicR.Key == dicS.Key)
                    {
                        int starNum = dicStar[dicS.Key];
                        //Response.Write("star num is:" + starNum);
                        star =(double) starNum / totalNum;
                        dicStarRate.Add(dicS.Key, star);
                       
                    }
                }
            }
            return dicStarRate;
        }
    }
}
技术细节: 

一个表空间offline后alert日志报ORA-01135 和ORA-01110的问题

一个表空间offline后alert日志报ORA-01135 和ORA-01110的问题
  • msdnchina
  • msdnchina
  • 2015年03月17日 07:59
  • 3156

Spark日志分析项目Demo(1)--Flume-ng的安装

项目介绍 该项目类似于团购网站的日志处理过程。 离线日志处理: 原始网站日志->Flume-ng采集->HDFS->Hive->Spark离线处理 实时日志处理过程: 原始网站日志->Flu...
  • zhi_fu
  • zhi_fu
  • 2017年07月19日 20:55
  • 331

Nexus的配置与管理

1 nexus的下载地址: http://www.sonatype.org/nexus/     2  使用maven插件进行上传jar包时要点选 offline  3 如下错误解决方法    4 ...
  • jintianhen1
  • jintianhen1
  • 2013年07月10日 10:03
  • 2564

解决android开发中设备offline的问题

现在应该经常会遇到了。因为现在各类想在你的手机上偷摸儿安装各种玩意儿的玩意儿多了:)         这个算伏笔。 我遇到的情况开始看起来很诡异:启动电脑,启动eclipse,打开DDMS,...
  • anod
  • anod
  • 2015年07月20日 16:42
  • 4383

WAS GC 日志分析

WAS GC日志native_stderr.log分析          我们可以通过添加JVM启动参数 -verbose:gc 或者在管理控制台上勾选详细垃圾回收选项来打印更详细的GC日志,缺省日志...
  • Shen_Guo
  • Shen_Guo
  • 2015年12月31日 19:04
  • 2049

动手解决Maven在offline模式中无法使用的BUG

本文主要解决以下问题:     1. 使用到tycho,且tycho的版本低于0.25.0 Tycho大大简化了Eclipse、OSGi插件中的pom.xml,它实际上是一系列专用于build Ecl...
  • o274274
  • o274274
  • 2016年10月10日 10:38
  • 1874

Monkey测试结果分析

测试准备: Monkey压力测试时除了添加测试APP,还可另外添加2-3个第三方app进行对比测试。 1.在D盘新建一个txt文件,添加APP包名,命名为whitelist.txt 2.用cm...
  • qq_15158911
  • qq_15158911
  • 2016年12月03日 15:19
  • 3025

Nginx日志分析shell

原文出处 http://blog.luwenju.com/158.html      在很多时候,我们会非常关注网站的访问量,比如网站的日PV是多少、网站某个功能上线之后点击量是多少,像这些东西...
  • Steven_liwen
  • Steven_liwen
  • 2016年08月04日 16:57
  • 1093

RAC节点服务ora.rac2.gsd的offline问题解决方法(转)

关于RAC节点服务ora.rac2.gsd的offline问题解决方法 我没有时间去测试,先记录下来。当看到bolg时,会想起这回事。去测试一下 模拟节点故障时,rac2的vip顠到了rac1,C...
  • shushugood
  • shushugood
  • 2013年03月05日 17:33
  • 4725

日志分析方法概述 & Web日志挖掘分析的方法

日志在计算机系统中是一个非常广泛的概念,任何程序都有可能输出日志:操作系统内核、各种应用服务器等等。日志的内容、规模和用途也各不相同,很难一概而论。 本文讨论的日志处理方法中的日志,仅指...
  • ronmy
  • ronmy
  • 2017年04月08日 23:13
  • 2969
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:offline日志分析(1)
举报原因:
原因补充:

(最多只允许输入30个字)