文档章节

nginx服务器日志分析的web实现

老海
 老海
发布于 2014/11/21 20:36
字数 1318
阅读 118
收藏 2
点赞 0
评论 0

      其实GoAccess作为nginx服务器的日志实时分析是不错的,可以在命令行快速地查看统计报告,过滤搜索引擎的ip,查看用户操作系统等,也可以生成html的报告。web呈现的日志分析工具AWStats界面也还不错。不过要想把多台分散的服务器的日志统一查看,还要方便其他Partner查看,感觉还是自己简单搞一个比较好,毕竟不管用什么工具原始的日志数据都是一样的,自己定义过滤方法就好了,于是开始了重复造轮子的工作。

      实现方式是先切割每个站点的日志,然后解析日志文件存入数据库,这个数据库如果用rds的话,分散的数据也可以比较方便的集中存进去。这样之后就可以通过sql来进行过滤,选出需要的数据就可以在web端查看了。

日志切割:

1
2
3
#!/bin/bash
mv/your/log/path/your/log/path-`date+%Y%m%d`
killall -s USR1 nginx

      将脚本加入任务计划,每日执行,即可得到每天的日志,当然也可以压缩一下,这样到时候解析的时候先解压就好了。

      然后就是写php解析文件导入数据库的方法,网上搜搜发现有现成的,那改改就可以用了,数据连接用的mysql_connect(),也不改成pdo了,先执行试试。

解析文件导入数据库代码如下:

addlog.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//数据库连接
functionconnectDB(){
    if(!isset($connect)) {
        $connect= mysql_connect("host","username","password");
        if(!$connect) {
            die('Can not connect to database.');
        }
        mysql_select_db("yourLogDb",$connect);
        mysql_query("SET NAMES utf8",$connect);
        $conn=$connect;
    }
    return$conn;
}
 
/**
 * [loadTxtDataIntoDatabase description]
 * @param  [string]    $splitChar  [spliter]
 * @param  [string]    $file       [filePath]
 * @param  [string]    $table      [tableName]
 * @param  [dbConnect] $conn       [dbConnect]
 * @param  [array]     $fields     [tableFields]
 * @param  [string]    $insertType [INSERT or REPLACE]
 * @return [array]     result
 */
functionloadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields=array(),$insertType='INSERT'){
    if(empty($fields))$head="{$insertType} INTO `{$table}` VALUES('";
    else$head="{$insertType} INTO `{$table}`(`".implode('`,`',$fields)."`) VALUES('";
    $end="')";   //生成sql首尾
 
    $f1=fopen($file,'r');
    $tmp=tempnam('/your/temp/file/path','tem');//创建临时文件
    $f2=fopen($tmp,'w');
    while(!feof($f1)){
      $line=fgets($f1);
      //过滤static文件夹下的css、js等静态文件,如果需要这些数据的话可以不用过滤
      if(!strpos($line,'/static/'))fputs($f2,$line);
    }
    fclose($f1);
    fclose($f2);
    rename($tmp,$file);
 
    $sqldata= trim(file_get_contents($file));
    if(preg_replace('/\s*/i','',$splitChar) =='') {
        $splitChar='/(\w+)(\s+)/i';
        $replace="$1','";
        $specialFunc='preg_replace';
    }else{
        $splitChar=$splitChar;
        $replace="','";
        $specialFunc='str_replace';
    }
 
    $sqldata= preg_replace('/(\s*)(\n+)(\s*)/i','\'),(\'',$sqldata);   //删除换行
    $sqldata=$specialFunc($splitChar,$replace,$sqldata);               //替换分隔符
    $query=$head.$sqldata.$end;   //合成sql语句
    if(mysql_query($query,$conn))returnarray(true);
    else{
        returnarray(false,mysql_error($conn),mysql_errno($conn));
    }
}
 
/**
 * [addLogToTabel description]
 * @param  [string] $filepath  [nginxLogPath]
 * @param  [string] $tablename [tableName]
 * @return          result
 */
functionaddLogToTabel($filepath,$tablename){
    $splitChar='yoursplitChar';   //分隔符,要与nginx日志中定义的分割符相同
    $date=date("Ymd",time());
    $file=$filepath.'-'.$date;
    //这里的字段定义与nginxlog里面的默认项相同,可以按需更改
    $fields=array('remote_addr','remote_user','time_local','request','status',
              'body_bytes_s','http_referer','http_user_agent','http_x_forwarded_for');
    $table=$tablename;
    $conn= connectDB();
    $result= loadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields);
    if(array_shift($result)){
        echo'Success!';
    }else{
        echo'Failed!--Error:'.array_shift($result).'<br/>';
    }
}

      这里addLogToTabel方法里的分隔符($splitChar)需要定义好,不能是“-”之类的会与nginxlog里面的字段内容冲突的符号,不然执行sql时会报错。

      然后添加一个文件来调用addLogToTabel方法就可以完成解析日志存入数据库的操作了。

调用代码:

site.php
1
2
3
4
5
6
7
require'addlog.php';
try{
    addLogToTabel('/your/log/path','tableName');
}catch(Exception$e) {
    print$e->getMessage();
    exit();
}

      执行site.php,显示“Success!”,数据导入就好了,把site.php也加入任务计划,就可以每天自动解析日志导入数据库了。

      同样的方法可以把nginx的errorlog也导入到数据库中来查看,不过errorlog可能实时查看和处理会更好。

      之后的操作就是通过sql从数据库按需选取数据在页面上显示出来了,比如需要查看真实用户的访问量,就把Googlebot、Baiduspider、bingbot等搜索引擎的数据过滤掉;如果要需要查看特定ip的浏览量,通过GROUP BY就可以统计出;如果需要查看ip对应的地理位置,那就使用一些ip库的api来获取……其他一些复杂的分析也可以基于数据库中的日志数据进行分析了。

      下面是一个站点的单日ip和userAgent浏览量的简单统计结果,搜索引擎的数据还没过滤掉的情况:

ip

useragent

      一个简单的web端日志查看应用差不多弄好了,更多的统计分析功能可以慢慢加上去。由于是用数据库存储日志数据,后期访问量大了产生很多日志的时候会影响查询速度,新增日志数据的开销也会增大,不过现在还没到那个程度,积累一段时间的数据先用水平分表来解决一下就好了。

© 著作权归作者所有

共有 人打赏支持
老海
粉丝 2
博文 3
码字总数 0
作品 3
海淀
Linux日志分析系统Awstat分析nignx日志

一.简述 AWStats 软件是一个免费的强大的基于Perl的WEB日志分析工具,显示你所有的网页/邮件/ FTP统计包括访问,访问者,页面,点击,高峰时间,操作系统,浏览器,搜索引擎,关键字,机器人...

lqbyz ⋅ 2017/09/18 ⋅ 0

Nginx反向代理与负载均衡:节点服务器单/多虚拟机配置+实验环境搭建+原理解析

0.说明 常见的集群架构及相关软件,可以参考下面的导图: 互联网企业常用的是负载均衡集群和高可用性集群,负载均衡集群强调“分担”,通过一定的调度算法 ,可以实现用多个节点服务器来分担...

xpleaf ⋅ 2017/03/06 ⋅ 0

nginx日志分析工具 goaccess-nginx

提到web服务器就不得不说Nginx。这款由俄罗斯人开发的小巧的web服务软件近几年来风靡大江南北;成为许多草根站长建设网站的首选。但由于历史原因,nginx在日志分析工具相较于传统的apache、l...

鱼煎 ⋅ 2016/09/22 ⋅ 0

Django之部署NGINX+uWSGI

参考地址:http://www.cnblogs.com/CongZhang/p/6548529.html http://www.cnblogs.com/alex3714/p/6538374.html http://uwsgi.readthedocs.io/en/latest/tutorials/Djangoandnginx.html ----......

LinQiH ⋅ 2017/11/07 ⋅ 0

nginx web日志介绍和分析

nginx web日志介绍和分析 Nginx访问日志打印的格式可以自定义,例如Nginx日志打印格式配置如下,Log_format 用来设置日志格式,Name(模块名) Type(日志类型),可以配置多个日志模块,分别供不...

JAYZ_HAO ⋅ 2017/09/09 ⋅ 0

什么是WAF(lua+nginx)

一、了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列...

菜鸟东哥 ⋅ 2017/08/24 ⋅ 0

ELK 日志服务器安装部署

我们的公共号 来自队员 谆谆 拟写 简单介绍: ELK是三个开源工具组成,简单解释如下: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本...

乌龟运维 ⋅ 2017/06/02 ⋅ 0

nginx日志分割处理以及分析

在很多时候,我们会非常关注网站的访问量,比如网站的日PV是多少、网站某个功能上线之后点击量是多少,像这些东西都是需要从web容器中的访问日志统计出来的,下面我们看一下如何在nginx中统计...

独钓渔 ⋅ 2015/08/26 ⋅ 0

使用nginx+lua实现WAF功能

一、了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级***防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针...

kuSorZ ⋅ 今天 ⋅ 0

Nginx漏洞利用与安全加固

本文主要分为两大部分,第一部分介绍了Nginx的一些常见安全漏洞的形成原因、利用方法,并给出了相应的解决办法;第二部分介绍了Nginx安全加固时需要关注的主要内容。 Nginx(发音同engine x)是...

90xa ⋅ 2015/04/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 39分钟前 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部