Chinaunix首页 | 论坛 | 博客
  • 博客访问: 473472
  • 博文数量: 95
  • 博客积分: 1773
  • 博客等级: 上尉
  • 技术积分: 1641
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-17 23:28
文章分类
文章存档

2018年(2)

2017年(10)

2016年(7)

2015年(48)

2014年(2)

2013年(2)

2012年(2)

2011年(7)

2010年(7)

2009年(3)

2008年(1)

2007年(4)

分类: 系统运维

2010-12-06 17:11:27

    awstats日志分析按日分析的指令需要添加-databasebreak=day这样的参数,否则会默认按月分析。对按日分析结果的浏览是在默认浏览的基础上添加databasebreak=day&year=YYYY&month=MM&day=DD 这样的浏览参数,其中YYYY/MM/DD分别代表年/月/日,即最终浏览访问的URL会是如下形式:   

http://sitehost/path/awstats.pl&config=confname&databasebreak=day&year=YYYY&month=MM&day=DD

    按日分析后因为awstats默认导航机制只支持按月分析的导航,所以浏览起来十分不方便,需要添加一个导航前端。网上车东东有一个利用php的导航前端介绍,但这个导航前端我觉得因为要求服务器提供php支持,可能不一定实用。我觉得采用框架加脚本的形式可能更好,因为具体的导航只是一个框架中页面链接地址的转换。我利用51js.com的JCalendar 日历控件改造了一个导航框架(注这个日历控件在日期计算上有多处bug,我都进行了修改),还添加了多站点的支持,实现如下:
框架页面day.html:

<html>
    <head>
        <title>网站日志分析(按日)</title>
        <meta http-equiv="content-type" content="text/html;charset=utf8">
    </head>
    <frameset cols="170,*">
    <frame name="menu" src="dayindex.html" noresize="noresize" frameborder="1" />
    <frame name="showall" src="dayabout.html" noresize="noresize" scrolling="yes" frameborder="0" />
    <noframes><body>你的浏览器不支持框架,故不能正常显示页面</body></noframes>
    </frameset>
</html>

其中dayindex.html是具体的导航页面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Language" content="zh-cn" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JCalendar 日历控件</title>
<style type="text/css">
#calendar_contain {
        width:165px;
        height:125px;
}
#calendar {
        border-collapse:collapse;
        border:1px solid #06C;
        background-color:#FFF;
        width:160px;
        height:120px;
        font-size:12px;
        font-family:'Lucida Grande','Lucida Sans Unicode','宋体','新宋体',arial,verdana,sans-serif;
        cursor:default;
}

#calendar td {
        text-align:center;
        vertical-align:middle;
        font-family:"宋体";
}

#calendar thead {
        background-color:#06C;
        color:#FFF;
}

#calendar div {
        width:100%;
        height:100%;
}

#calendar caption span {
        cursor:pointer;
}

#calendar #calendar_title {
        cursor:default;
}
</style>
<script type="text/javascript">

var conf='confname1';
function monthshow(month){
    return (month-1)
}

function changeit(selObj){
 conf=selObj.options[selObj.selectedIndex].value;

}

var lasterday=new Date(2010,monthshow(12),1);//配置最早的按日分析日期是2010.12.2

</script>
<script src="./today.js" type="text/javascript"></script>
<script type="text/javascript">

function showDay(year,month,date){

        tmpday=new Date(year,monthshow(month),date);
        if (( tmpday > lasterday ) && (servertoday > tmpday )){
                url="/cgi-bin/awstats.pl?databasebreak=day&config="+conf+"&year="+year+"&month="+month+"&day="+date; //这里定义链接导航的具体地址,请按需要修改
                top.showall.location.href=url;
        }else {
                alert("日志没有分析");
        }

}

/***************************
 *JCalendar日历控件
 *@author brull
 *@email [email]brull@163.com[/email]
 *@date 2007-4-16
 ***************************/

/*
 *@param year 年份
 *@param month 月份
 *@param date 日期
 */
 /*如果参数不足三个那么就初始化为当天日期*/
function JCalendar (year,month,date) {
        var _date = arguments.length == 0 ? new Date() : new Date(year,month-1,date);
        //实例变量
        this.year = _date.getFullYear();
        this.month = _date.getMonth() + 1;
        this.fday = new Date(this.year,this.month-1,1).getDay();//每月第一天的前一天星期数
        this.dayNum = new Date(this.year,this.month,0).getDate();//每月的天数
        //成员变量,当前年月日
        JCalendar.cur_year = this.year;
        JCalendar.cur_month = this.month;
        JCalendar.cur_date = _date.getDate();
}
JCalendar.prototype.show = function(){
        var date = new Array(this.fday);//预先定义一段空数组,对应日历里第一周空的位置
        var html_str = new Array();
        var date_index = 0;
        var weekDay = ["日","一","二","三","四","五","六"];
        for(var j = 1; j <= this.dayNum; j++){//初始化date数组
                date.push(j);
        }
        html_str.push("

");
        html_str.push("
");
        html_str.push("
");
        for(var i = 0; i < 7; i++){//填充日历头
                html_str.push("
");
        }
        html_str.push("
");
        html_str.push("
");
        for(var i = 0; i < 6; i++){//填充日期
                html_str.push("
");
                for(var j = 0; j < 7; j++){
                        tmp = date[date_index++];
                        tmp = tmp ? tmp : "";
                        if(JCalendar.cur_date == tmp)
                                html_str.push("
");
                        else if(tmp == "")
                                html_str.push("
");
                        else
                                html_str.push("
");
                }
                html_str.push("
");
        }
        html_str.push("
this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" onclick=\"JCalendar.update(-12);return false\" style='color:#09F;font-size:16px;margin-right:5px;'>«this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" onclick=\"JCalendar.update(-1);return false\" style='margin-right:15px;color:#09F;'>▲" + this.year + "年" + this.month + "月JCalendar.update(1);return false\" onmouseover=\"this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" style='margin-left:15px;color:#09F;'>▼JCalendar.update(12);return false\" onmouseover=\"this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" style='font-size:16px;margin-left:5px;color:#09F;'>»
" + weekDay[i] + "
" + JCalendar.cur_date + "
this.style.backgroundColor='#CCC'\" onmouseout=\"this.style.backgroundColor=''\" onclick='JCalendar.click(this)'>" + tmp + "
");
        return html_str.join("");
}
//静态方法
JCalendar.update = function(_month){
        var date = new Date(JCalendar.cur_year,JCalendar.cur_month - 1 + _month,1);
        var fday = date.getDay();//每月第一天的星期数
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var dayNum = new Date(JCalendar.cur_year,JCalendar.cur_month + _month,0).getDate();//每月的天数
        var tds = document.getElementById("calendar").getElementsByTagName("td");
        for(var i = 7; i < tds.length; i++)//清空日历内容
                tds[i].innerHTML = "";
        document.getElementById("calendar_title").innerHTML = year + "年" + month + "月";//更新显示年月
        //更新当前年月
        JCalendar.cur_year = year;
        JCalendar.cur_month = month;
        for(var j = 1; j <= dayNum; j++){
                if(j == JCalendar.cur_date)
                        tds[6 + fday + j].innerHTML = "" + JCalendar.cur_date + "";
                else
                        tds[6 + fday + j].innerHTML = "
this.style.backgroundColor='#CCC'\" onmouseout=\"this.style.backgroundColor=''\" onclick='JCalendar.click(this)'>" + j + "
"
;
        }
        JCalendar.onupdate(year,month,JCalendar.cur_date);
}

JCalendar.onupdate = function(year,month,date){//日历更改时执行的函数,可以更改为自己需要函数,控件传递过来的参数为当前日期
    return showDay(year,month,date);
}

JCalendar.click = function(obj){
        var tmp = document.getElementById("c_today");
        tmp.parentNode.innerHTML = "
this.style.backgroundColor='#CCC'\" onmouseout=\"this.style.backgroundColor=''\" onclick='JCalendar.click(this)'>" + tmp.innerHTML + "
"
;
        JCalendar.cur_date = parseInt(obj.innerHTML);
        obj.parentNode.innerHTML = "" + obj.innerHTML + "";
        JCalendar.onclick(JCalendar.cur_year,JCalendar.cur_month,JCalendar.cur_date);
}

JCalendar.onclick = function(year,month,date){//点击日期时执行的函数,可以更改为自己需要函数,控件传递过来的参数为当前日期
       return showDay(year,month,date);
}</script>
</head>
<body>
<h4>按日分析</h4>
<p>请选择服务器:
<select id="selc" name="selc" onchange="changeit(this)">
        <option value="confname1">XXXX1-ip1</option>
        <option value="confname2">XXXX2-ip2</option>

        <option value="confname3">XXXX3-ip3</option>

        <option value="confname4">XXXX4-ip4</option>
</select>
</p>
<p>请选择日期:
</p>
<div id="calendar_contain"></div>
<p><br/><a target="_top" href="./index.html">观看其他日志分析</a></p>
<script type="text/javascript">
/***************说明***************
JCalendar.onclick (year,month,date)//点击日期时执行的静态函数,可以更改(或者覆盖)为自己需要函数,控件传递过来的参数为当前日期
JCalendar.onupdate (year,month,date){//日历更改时执行的函数,可以更改(或者覆盖)为自己需要函数,控件传递过来的参数为当前日期
***********************************/
//一个例子
/*
JCalendar.onclick = function (year,month,date){
        tmpday=Date(year,month,date);
        if ( (tmpday-lasterday > 0) && (servertoday-tmpday < 0)){
                alert("today is:" + year + "-" + month + "-" + date);
        }
}
//*/
  document.getElementById("calendar_contain").innerHTML = new JCalendar().show();
</script>
</body>

</html>

通过利用lasterday和servertoday这两个全局变量来定义有效的日志分析日期。
因为lasterday是历史时间,一般可以固化(当然也是可以动态设定的),而服务器当天是变化的,需要一定的机制来获得,所以这里引入了一个外部脚本today.js完成,这个脚本由服务每日自动更新(之所以不采用客户端日期,是因为客户端日期不可控)。
阅读(2463) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~